参考资料:
1.卷积的基本概念
首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。
注意:卷积和协相关的差别是,卷积需要先对滤波矩阵进行180的翻转,但如果矩阵是对称的,那么两者就没有什么差别了。
对于滤波器,也有一定的规则要求:
- 滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。
- 滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。当然了,这不是硬性要求了。
- 如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
- 对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。
2.各个卷积核的使用效果
2.1 啥也不做
2.2 图像锐化滤波器(Sharpness Filter)
图像的锐化和边缘检测很像,首先找到边缘,然后把边缘加到原来的图像上面,这样就强化了图像的边缘,使图像看起来更加锐利了。这两者操作统一起来就是锐化滤波器了,也就是在边缘检测滤波器的基础上,再在中心的位置加1,这样滤波后的图像就会和原始的图像具有同样的亮度了,但是会更加锐利。
我们把核加大,就可以得到更加精细的锐化效果
另外,下面的滤波器会更强调边缘:
主要是强调图像的细节。最简单的3x3的锐化滤波器如下:
实际上是计算当前点和周围点的差别,然后将这个差别加到原来的位置上。另外,中间点的权值要比所有的权值和大于1,意味着这个像素要保持原来的值。
2.3 边缘检测(Edge Detection)
我们要找水平的边缘。需要注意的是,这里矩阵的元素和是0,所以滤波后的图像会很暗(数字图像中,255对应纯白,0对应纯黑)
,只有边缘的地方是有亮度的。
为什么这个滤波器可以寻找到水平边缘呢?因为用这个滤波器卷积相当于求导的离散版本:你将当前的像素值减去前一个像素值,这样你就可以得到这个函数在这两个位置的差别或者斜率。下面的滤波器可以找到垂直方向的边缘,这里像素上和下的像素值都使用:
再下面这个滤波器可以找到45度的边缘:取-2不为了什么,只是为了让矩阵的元素和为0而已。
那下面这个滤波器就可以检测所有方向的边缘:
为了检测边缘,我们需要在图像对应的方向计算梯度。用下面的卷积核来卷积图像,就可以了。但在实际中,这种简单的方法会把噪声也放大了。另外,需要注意的是,矩阵所有的值加起来要是0.
2.4 浮雕(Embossing Filter)
简单看一下实现浮雕效果所使用的卷积核:
浮雕滤波器可以给图像一种3D阴影的效果。只要将中心一边的像素减去另一边的像素就可以了。这时候,像素值有可能是负数,我们将负数当成阴影,将正数当成光,然后我们对结果图像加上128的偏移。这时候,图像大部分就变成灰色了。
下面是45度的浮雕滤波器
我们只要加大滤波器,就可以得到更加夸张的效果了
2.5 均值模糊(Box Filter)
我们可以将当前像素和它的四邻域的像素一起取平均,然后再除以5,或者直接在滤波器的5个地方(注意:图中卷积核中心写错了,应该是0.2)
取0.2的值即可,如下图:
可以看到,这个模糊还是比较温柔的,我们可以把滤波器变大,这样就会变得粗暴了:注意要将和再除以13.
所以,如果你想要更模糊的效果,加大滤波器的大小即可。或者对图像应用多次模糊也可以。
2.6 高斯模糊(Gaussian Blur)
均值模糊很简单,但不是很平滑。高斯模糊就有这个优点,所以被广泛用在图像降噪上
。特别是在边缘检测之前,都会用来移除细节。高斯滤波器是一个低通滤波器。
2.7 运动模糊(Motion Blur)
简单看一下实现浮雕效果所使用的卷积核:
运动模糊可以通过只在一个方向模糊达到,例如下面9x9的运动模糊滤波器。注意,求和结果要除以9。
这个效果就好像,摄像机是从左上角移动的右下角。
3.卷积的计算
对图像处理而言,存在两大类的方法:空域处理和频域处理!空域处理
是指直接对原始的像素空间进行计算,频率处理
是指先对图像变换到频域,再做滤波等处理。
3.1 空域计算-直接2D卷积
-
计算方法:
直接2D卷积就是一开始说的那样,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。
直接的实现也称为暴力实现brute force,因为它严格按照定义来实现,没有任何优化。当然了,在并行实现里面,它也是比较灵活的。另外,也存在一个优化版本,如果我们的kernel是separable可分的,那么就可以得到一个快5倍左右的卷积方法。
-
边界处理
那卷积核遇到图像边缘怎么办?例如图像顶部的像素,它的上面已经没有像素了,那么它的值如何计算?目前有四种主流的处理方法,我们用一维卷积和均值滤波来说明下。
我们在1D图像中,用每个像素和它的二邻域的平均值来取代它的值。假设我们有个1D的图像I是这样的:
对非图像边界的像素的操作比较简单。假设我们对I的第四个像素3做局部平均。也就是我们用2,3和7做平均,来取代这个位置的像素值。也就是,平均会产生一副新的图像J,这个图像在相同位置J (4) = (I(3)+I(4)+I(5))/3 = (2+3+7)/3 = 4。同样,我们可以得到J(3) = (I(2)+I(3)+I(4))/3 =(4+2+3)/3 = 3。需要注意的是,新图像的每个像素都取决于旧的图像,在计算J (4)的时候用J (3)是不对的,而是用I(3),I(4)和I(5)。所以每个像素都是它和它邻域两个像素的平均。平均是线性的操作,因为每个新的像素都是旧像素的线性组合。
对卷积,也有必须要考虑的情况是,在图像边界的时候,怎么办?J(1)的值应该是什么?它取决于I(0),I(1)和I(2)。但是我们没有I(0)呀!图像左边没有值了。有四种方式来处理这个问题:
方法一:想象I是无限长的图像的一部分,除了我们给定值的部分,其他部分的像素值都是0。在这种情况下,I(0)=0。所以J(1) = (I(0) + I(1) + I(2))/3 = (0 + 5 + 4)/3= 3. 同样,J(10) = (I(9)+I(10)+I(11))/3 = (3+ 6 + 0)/3 = 3.
方法二:想象I是无限图像的一部分。但没有指定的部分是用图像边界的值进行拓展。在我们的例子中,因为图像I最左边的值I(1)=5,所以它左边的所有值,我们都认为是5 。而图像右边的所有的值,我们都认为和右边界的值I(10)一样,都是6。这时候J(1) = (I(0) + I(1) + I(2))/3 = (5 + 5 + 4)/3= 14/3. 而J(10) = (I(9)+I(10)+I(11))/3 = (3 + 6 + 6)/3 = 5。
方法三:认为图像是周期性的。也就是I不断的重复。周期就是I的长度。在我们这里,I(0)和I(10)的值就是一样的,I(11)的值和I(1)的值也是一样的。所以J(1) = (I(0) + I(1) + I(2))/3= (I(10) + I(1)+ I(2))/3 = (6 + 5 + 4)/3 = 5 。
3.2 频域计算-快速傅里叶变换FFT卷积
后面的部分还没学习,详见:http://blog.csdn.net/zouxy09/article/details/49080029
4.图像滤波
4.1 图像滤波的目的
滤波就是要去除没用的信息,保留有用的信息,可能是低频,也可能是高频
4.2 图像的滤波方法
图像的滤波方法很多,主要可以分为频率域法
和空间域法
两大类。频率域法的处理是在图像的某种变换域内,对图像的变换系数值进行运算,然后通过逆变换获得增强图像。这是一种间接的图像滤波方法。空间滤波方法是一类直接的滤波方法,它在处理图像时直接对图像灰度作运算。
-
频率域滤波
将图像从空间或时间域转换到频率域,再利用变换系数反映某些图像特征的性质进行图像滤波。
傅立叶变换是一种常用的变换。在傅立叶变换域,频谱的直流分量正比于图像的平均亮度,噪声对应于频率较高的区域,图像实体位于频率较低的区域。图像在变换具有的这些内在特性可被用于图像滤波。可以构造一个低通滤波器,使低频分量顺利通过而有效地阻于高频分量,即可滤除图像的噪声,再经过反变换来取得平滑的图像。
低通的数学表达式如下所示:
F(u,v)表示原图的在傅里叶域的图像
H(u,v)表示传递函数(即低通滤波器)
G(u,v)表示经过低通滤波的F(u,v)
选择适当的传递函数H (u, v)对频率域低通滤波关系重大。常用的传递函数有
梯形函数
、指数函数
、巴特沃思函数
等。
频域常用的几种低通滤波器为:理想低通滤波器(Ideal circular Iow-passfilter)
、巴特沃思(Butterworth)低通滤波器
、指数低通滤波器
及梯形低通滤波器
。这些低通滤波器,都能在图像内有噪声干扰成分时起到改善的作用。
平面空间域滤波
平面空间域滤波法主要分为两类:
- 拟合图像的方法,包括n阶多项式拟合、离散正交多项式拟合、二次曲面拟合等
- 平滑图像的方法,包括领域平均法、中值滤波法、梯度倒数加权法、选择式掩模法等
平面空间域滤波主要使用两种滤波器:
- 高通滤波器:边缘提取与增强。边缘区域的灰度变换加大,也就是频率较高。所以,对于高通滤波,边缘部分将被保留,非边缘部分将被过滤
- 低通滤波:将会是边缘部分变得平滑。
注意:高斯滤波是一种线性平滑滤波,即低通滤波,适用于消除高斯噪声。
常用的高斯模板有如下几种形式:
高斯模板中的参数是通过高斯函数计算出来的。计算高斯模板参数时,通过如下公式:
x的平方和y的平方分别表示的是邻域内其他像素与邻域内中心像素的距离,Sigmma代表的是标准差。
实验效果图:(后面补)
常见的低通滤波实验效果图
线性与非线性滤波
- 线性滤波:
线性滤波器的原始数据与滤波结果是一种算术运算,即用加减乘除等运算实现,如均值滤波器(模板内像素灰度值的平均值)
、高斯滤波器(高斯加权平均值)
等。由于线性滤波器是算术运算,有固定的模板,因此滤波器的转移函数是可以确定并且是唯一的(转移函数即模板的傅里叶变换)。 - 非线性滤波:
非线性滤波器的原始数据与滤波结果是一种逻辑关系,即用逻辑运算实现,如最大值滤波器
、最小值滤波器
、中值滤波器
等,是通过比较一定邻域内的灰度值大小来实现的,没有固定的模板,因而也就没有特定的转移函数(因为没有模板作傅里叶变换),另外,膨胀和腐蚀也是通过最大值、最小值滤波器实现的。五种常见的非线性滤波算子,这五种滤波算子对不同的图像都会有不同的作用,最常用的是中值滤波,因为它的效果最好且信息损失的最少。- 极大值滤波:
极大值滤波就是选取像素点领域的最大值作为改点的像素值,有效率去了灰度值比较低的噪声,也可作为形态学里面的膨胀操作。 - 极小值滤波:
与极大值滤波相反。 - 中点滤波:
中点滤波器将邻域的最大和最小值求平均来代替当前像素点值。 - 中值滤波:
中值滤将邻域内像素点值排序,用序列中的中值取代当前像素点值。可以消除图像中的长尾噪声,例如负指数噪声和椒盐噪声。 - 加权中值滤波(中值滤波的改进)
网上的解释:
加权中值滤波是在中值滤波的基础上加以改进,其性能在一定程度上优于中值滤波。
下面是自己在算法上的改进,以例子说明:
若说选模板的大小为5,那么这个模板就唯一确定为:
1 1 5 1 1
1 1 5 1 1
5 5 5 5 5
1 1 5 1 1
1 1 5 1 1
上图中的数字表式改点像素在序列中出现的次数。然后根据模板平滑图像。实验证明该方法好于传统中值滤波。
自己的理解:
加权中值滤波就是在对邻域像素值进行排序时,有些像素值让它多出现几次。比如上面的模板,就是让与当前像素点同行同列的像素点的值都出现5次。
- 极大值滤波:
5.结语
图像的卷积核滤波是图像处理中比较基础又很重要的部分,主要应用在去除图像噪声,提取图像边缘等场合。
文中如有不当之处欢迎留言。我们下次再见。