大家好,又见面了,我是你们的朋友全栈君。
该篇主要是对图像滤波算法一个整理,主要参考的大神的博客:
https://blog.csdn.net/qq_15606489/article/details/52755444
1:图像滤波既可以在实域进行,也可以在频域进行。图像滤波可以更改或者增强图像。通过滤波,可以强调一些特征或者去除图像中一些不需要的部分。滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最终的输出值。
图像滤波可以通过公式:
O(i,j)=∑m,nI(i+m,j+n)∗K(m,n) O ( i , j ) = ∑ m , n I ( i + m , j + n ) ∗ K ( m , n )
其中K为滤波器,在很多文献中也称之为核(kernel)。常见的应用包括去噪、图像增强、检测边缘、检测角点、模板匹配等。
2:均值滤波
用其像素点周围像素的平均值代替元像素值,在滤除噪声的同时也会滤掉图像的边缘信息。在OpenCV中,可以使用boxFilter和blur函数进行均值滤波。均值滤波的核为:
3:中值滤波
中值滤波用测试像素周围邻域像素集中的中值代替原像素。中值滤波去除椒盐噪声和斑块噪声时,效果非常明显。在OpenCV中,可以使用函数medianBlur进行操作。
4:高斯滤波
这里参考一位大神的博客写的很细很好明白:https://blog.csdn.net/nima1994/article/details/79776802
总结一下:
- 像均值滤波,是简单的取平均值,模板系数都是1。而图像上的像素实际上是坐标离散但是值却连续的,因为越靠近的点关系越密切,越远离的点关系越疏远。因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。
- 既然是依据距离来加权平均,那么很容易想到高斯函数 f(x)=1σ2π√e−(x−μ)22σ2 f ( x ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 ,如图所示:
从高斯函数来看,离原点距离越近,得到的权重越高,越远离原点,得到的权重越小。
上边是一维的高斯函数,当中心点为原地时, x x 的均值
μ=0
,此时 f(x)=1σ2π√e−x22σ2 f ( x ) = 1 σ 2 π e − x 2 2 σ 2
由于图像是二维矩阵,则采用二维高斯函数 f(x,y)=12πσ2e−(x2+y2)2σ2 f ( x , y ) = 1 2 π σ 2 e − ( x 2 + y 2 ) 2 σ 2 有了这个函数就可以计算滤波模板中每个点的权重了。
权重矩阵:
假定中心点是(0,0),那么距离它最近的8个点的坐标如下:
更远的点以此类推。
将这模板中的坐标x,y代入到二维高斯函数中,假定 μ=0 μ = 0 , σ σ 为1.5,则模糊半径为1的权重矩阵如下:
这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。
计算高斯滤波的结果
假设现在3*3高斯滤波器覆盖的图像的像素灰度值为:
每个点与上边计算得到的9个权重值相乘:
得到:
将这9个值加起来,就是中心点的高斯模糊的值。
对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。
边界处理
如果一个点处于边界,周边没有足够的点,怎么办?
一个变通方法,就是把已有的点拷贝到另一面的对应位置,模拟出完整的矩阵。
5:双边滤波
参考了大神的博客:http://www.360doc.com/content/17/0306/14/28838452_634420847.shtml
高斯滤波只考虑了周边点与中心点的空间距离来计算得到权重。首先,对于图像滤波来说,一个通常的intuition是:(自然)图像在空间中变化缓慢,因此相邻的像素点会更相近。但是这个假设在图像的边缘处变得不成立。如果在边缘处也用这种思路来进行滤波的话,即认为相邻相近,则得到的结果必然会模糊掉边缘,这是不合理的,因此考虑再利用像素点的值的大小进行补充,因为边缘两侧的点的像素值差别很大,因此会使得其加权的时候权重具有很大的差别。可以理解成先根据像素值对要用来进行滤波的邻域做一个分割或分类,再给该点所属的类别相对较高的权重,然后进行邻域加权求和,得到最终结果。
双边滤波与高斯滤波相比,对于图像的边缘信息能够更好的保留,其原理为一个与空间距离相关的高斯核函数与一个灰度距离相关的高斯函数相乘。
空间距离: e−(xi−xc)2+(yi−yc)22σ2 e − ( x i − x c ) 2 + ( y i − y c ) 2 2 σ 2 ,其中 (xc,yc) ( x c , y c ) 是中心点坐标,比如为(0,0), (xi,yi) ( x i , y i ) 为当前点的坐标, σ σ 为空间域标准差。
灰度距离: e−(gray(xi,yi)−gray(xc,yc))22σ2 e − ( g r a y ( x i , y i ) − g r a y ( x c , y c ) ) 2 2 σ 2 ,其中 gray(xi,yi) g r a y ( x i , y i ) 是当前像素点的灰度值, gray(xc,yc) g r a y ( x c , y c ) 是模板中覆盖图片区域的中心点像素的灰度值,也就是(0,0)处的灰度值, σ σ 为值域标准差。
对于高斯滤波,仅用空间距离的权值系数核与图像卷积后确定中心点的灰度值。即认为离中心点越近,其权值系数越大。
双边滤波中加入了对灰度信息的权重,即在领域内,灰度值越接近中心点灰度值的点的权值更大,灰度值相差大的点权重越小。其权重大小则由值域高斯函数确定。
两者权重系数相乘,得到最终的卷积模板,由于双边滤波需要每个中心点领域的灰度信息来确定其系数,所以速度比一般的滤波慢得多,而且计算量增长速度为核的大小的平方。
参数的选择:空间域 σ σ 的选取,和值域 σ σ 的选取。
结论: σ σ 越大,边缘越模糊; σ σ 越小,边缘越清晰。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132377.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...