图像噪声,通常指图像中除了成像物体之外的其它信息,比如斑点和颗粒,这些额外的错误信息干扰了成像物体的显示,影响成像质量,所以往往需要通过图像滤波(也称为图像去噪)来消除这些噪点。常见的图像滤波算法有均值滤波、高斯滤波、中值滤波、双边滤波、非局部均值滤波,以及近几年火热的基于深度学习的图像滤波等。本章节将详细讲解均值滤波算法的原理,以及C++实现和优化。
首先膜拜一下那些写Opencv代码的大佬们,他们写的代码不仅稳定性良好,运行效率也超级高,很多时候我们费尽心思写了一个相同的算法,发现性能与Opencv的接口函数相比还是差了许多,所以会有一丢丢的心理落差,但是抱着学习的态度,追赶大佬的脚步,精益求精,相信我们自己也是可以的!
均值滤波,也就是计算每一个像素点周围像素点(包括该点)的平均值,作为该像素点滤波之后的值,通常取以该像素点为中心的矩形窗口内的所有像素点来计算平均值,矩形窗口的大小一般为3*3,5*5,9*9,...,(2n+1)*(2n+1)。窗口越大,滤波效果越好,但是图像也变得更加模糊,所以需要根据实际情况设置矩形窗口的大小。比如3*3窗口的均值滤波如下图所示,点(x,y)的滤波值由其周围9个点(包括其自身)计算平均值得到。
图中点(x,y)的滤波值用公式表示为:
对于(2n+1)*(2n+1)窗口,点(x,y)的平均滤波值可根据如下公式计算:
为了解决图像边缘像素点取不到完整矩形窗口的问题,通常先把图像的上、下边界扩充n行,左右边界扩充n列,实际计算时,只计算图像原有像素点的窗口平均值。比如当矩形窗口为3*3,则n的值为1,这种情况下扩充边界的示意图如下图所示:
根据以上原理,基于Opencv和C++的均值滤波实现代码如下:
vo