卷积在信号处理领域有极其广泛的应用,也有严格的物理和数学定义。
OpenCV中对图像进行模糊操作,其背后的原理就是卷积运算,可是究竟卷积运算是什么,模糊的卷积算法又是如何实现的呢?本文将进行讨论。考虑到大部分读者的非专业性,本人将尽量不使用专业术语,而使用通俗易懂的“白话”进行讲述,若有任何疑问或建议,望读者斧正。
注:需要读者有一定数学基础,能有一定矩阵基础或矩阵的概念,同时对统计学正态分布有概念,这对理解卷积算法很有帮助。
一、概述
(一)一维卷积运算
卷积运算需要两个对象,一个是被卷积的对象(操作数矩阵),一个是决定卷积效果的对象(卷积数矩阵),两着共同决定卷积运算的结果。
假设P为一个一维操作数矩阵,其值为[1,2,3,4,5,6,7,8,9];
假设R为一个一维卷积数矩阵,其值为[-1,0,1]。
对操作数矩阵中的每个数值,计算它左右两个数值和卷积数矩阵中对应位置的数值的乘积,然后把结果相加,最终得到的值就作为操作数矩阵中每个数值的新值。
如图1所示,每行灰色方格为操作数矩阵,橙色方格为卷积数矩阵,橙色方格依次向右移动:
1.如图1第1行所示,卷积数矩阵[-1,0,1]覆盖了操作数矩阵中的[1,2,3],那么操作数矩阵中的第2个数,原本为2,经过卷积运算后的新值为-1 * 1 + 0 * 2 + 1 * 3 = 2。
2.如图1第2行所示,卷积数矩阵[-1,0,1]覆盖了操作数矩阵中的[2,3,4],那么操作数矩阵中的第3个数,原本为3,经过卷积运算后的新值为-1 * 2 + 0 * 3 + 1 * 4 = 2。
3.如图1第3行所示,卷积数矩阵[-1,0,1]覆盖了操作数矩阵中的[3,4,5],那么操作数矩阵中的第4个数,原本为4,经过卷积运算后的新值为-1 * 3 + 0 * 4 + 1 * 5 = 2。
4.以此类推,第7次运算,卷积数矩阵[-1,0,1]覆盖了操作数矩阵中的[7,8,9],那么操作数矩阵中的第8个数,原本为8,经过卷积运算后的新值为-1 * 7 + 0 * 8 + 1 * 8 = 2。
图1 一维卷积运算
综上,除去第1位数值1和第9位数值9没有运算,P经过R卷积后的矩阵为[1,2,2,2,2,2,2,2,9]。
1.我们可以抛弃首位1与末位9作为运算的结果,即[2,2,2,2,2,2,2]。
2.也可以保留首位1与末位9,同时对第1位数值1和第9位数值9补充运算,我们在P的首尾各加一个数值,首位增加1(与原P第1位数值相同),尾位增加9(与原P第9位数值相同),得到的新矩阵P'为[1,1,2,3,4,5,6,7,8,9,9],其经过上述卷积数矩阵运算后的结果变为[1,2,2,2,2,2,2,2,1]。
(二)二维(平面图像)卷积运算
以数字图像处理中基本的处理方法线性滤波为例,待处理图像可被看做一个大二维矩阵,图像的每个像素对应大矩阵的每个元素。假设图像的分辨率是1920 * 1080,那么对应的大矩阵的行数为1080,列数为1920。
用于滤波的是一个滤波器小矩阵(也叫卷积核)。滤波器小矩阵一般是个奇数方阵(行数和列数为相同奇数的矩阵),比如用于边缘检测的Sobel算子就是两个3 * 3的小矩阵。
进行滤波就是对大矩阵中的每个像素,计算它周围像素和滤波器矩阵对应位置元素的乘积,然后把结果相加,最终得到的值就作为该像素的新值,这样就完成了一个像素点的滤波,如图2所示。
举个例子,假设图像为3 * 3矩阵(仅有9个像素,如图3),滤波器矩阵如图4,那么图3中像素P5,经过一次滤波运算后的新值P5' = P1 * R1 + P2 * R2 + P3 * R3 + P4 * R4 + P5 * R5 + P6 * R6 + P7 * R7 + P8 * R8 + P9 * R9。需要留意的是,这里的运算与传统的矩阵乘法运算并不相同,仅仅是将两个矩阵对应位置元素的乘积相加。
图2 卷积运算
图3 待处理图像
图4 滤波器矩阵
那么如何对一个大矩阵进行卷积运算呢?与一维卷积运算类似,从大矩阵的左上角开始,依次右移至右上角,然后下移一个单位,从左边再次依次移至右端,以此类推,直至卷积矩阵移至右下角,如图5和图6所示。
图5 图像卷积1
图6 图像卷积2
对于边缘像素,采用与一维卷积运算类似的方法,补充与边缘像素一样的像素进行卷积运算即可,或直接丢弃边缘像素。
如上文所述,对图像大矩阵和滤波小矩阵对应位置元素相乘再求和的操作就叫卷积运算或协相关运算。两者很类似,两者唯一的差别就是卷积在计算前需要翻转卷积核,而协相关则不需要翻转。
注:这里的翻转,指的是绕卷积核中心旋转180度后得到的新矩阵,与矩阵运算中的转置不同。
二维卷积运算需要4个嵌套循环,所以它并不快,除非我们使用很小的卷积核。我们一般使用3x3或者5x5,而且也有其他的规则要求:
(1)滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心,也就有了半径,例如5x5大小的核半径为2。
(2)滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。当然这不是硬性要求。
(3)如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
(4)若每个像素取值0~255,对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将其直接截断到0和255之间即可。对于负数,也可以取绝对值。
二、简单卷积操作
图像卷积操作最常见的效果就是图像的模糊与锐化。如下图7至图8的变换,即为图像的模糊。
图7 原图
图8 模糊图像
那么图像模糊的卷积算法是如何实现的呢?下面讲解几种图像卷积操作的算法。
注:为了保证处理后图片亮度一致,以下示例卷积核每个元素之和为1。
(一)均值模糊
均值模糊的卷积核矩阵如图9所示。
图9 均值模糊3*3卷积核矩阵
如上图所示,这是一个3 * 3的均值模糊矩阵,每个元素的值都为1/9。我们可以很明显地看出这个卷积核的数学特征,其本质就是将图像中某个像素点及周围8个像素点的值进行求和,然后求这9个像素点和的平均值,并将中心像素点的新值更改为平均值。同理,如果是5 * 5的卷积核,其每个元素应该为1/25。
让我们来想想,为什么图9这样的卷积核矩阵可以让图像看起来模糊了呢?可以看出,经过卷积运算后图像的各个像素点之间的“差异值”减小,即图像所有像素的方差减小,那么图像的观感就显得更加模糊。那如果我们使用 3 * 3 和 5 * 5两种大小的卷积核,哪种更加模糊呢?应该是第二种,各位读者可以算算两种卷积核处理后的差异。
其实,数值上,图像中每个像素点表现地更加平滑,图形上,图像中每个像素点表现地更加模糊,其本质就是“中间点”失去了细节。
(二)中值模糊
中值模糊与均值模糊不同,同样以3 * 3卷积核大小为例,其卷积算法可以表述为:将图像中某个像素点即周围8个像素点的值进行排序,然后求这9个像素点的中值,并将中心像素点的新值更改为中值。其效果与均值效果类似,均使得图像各个像素点之间的“差异值”减小,表现出模糊的视觉效果。
(三)边缘锐化
让我们看一个特殊的卷积核,如图10所示。
图10 示例卷积核
如果我们对一幅图像使用上述的卷积核,有什么变化呢?我们以图11的模糊图片为源图,图12展示了卷积处理后的结果,可以看到图12与图11相比,边缘轮廓更加清晰。
图11 模糊图像
图12 卷积处理后的图像
其实图10就是一个基本的3 * 3锐化滤波器矩阵,面积越大的卷积核锐化效果越明显。同样的,我们也可以通过调整卷积核来获得不同的锐化效果,如图13和图14所示。图10的锐化滤波器实际上是计算当前像素值和周围像素值的差别,然后将这个差别加到原来的位置上。另外,中间点的权值要比所有的权值和大于1,意味着这个像素是在保持原来值的基础上增加了这些差异值,同时因为卷积核的所有元素之和为1,也保证了其亮度不变。可能读者不是很理解,我们以图3的图像矩阵为例,使用图10的卷积核进行卷积运算:
P5 = (-1) * P1 + (-1) * P2 + (-1) * P3 + (-1) * P4 + 9 * P5 + (-1) * P6 + (-1) * P7 + (-1) * P8 + (-1) * P9 = P5 + (P5 - P1) + (P5 - P2) + (P5 - P3) + (P5 - P4) + (P5 - P6) + (P5 - P7) + (P5 - P8) + (P5 - P9)
(四)高斯模糊
与均值模糊不同的是,高斯模糊增加了对卷积核的权重考虑。均值模糊的卷积运算中,卷积核每个元素的权重相等,而高斯模糊,卷积核每个元素的权重参照了高斯分布。
我们先来看一下一维高斯分布(也叫做正态分布),如图13所示:
图13 一维高斯分布
正态分布中,越接近中心点,取值越大,越远离中心,取值越小。计算平均值的时候,我们只需要将“中心点”作为原点,其他点按照其在正态曲线上的位置来分配权重,就可以得到一个加权平均值。正态分布的密度函数也称为高斯函数,其一维表达式如图14所示:
图14 正态分布表达式
其中,μ是x的均值,σ是x的标准差。因为我们上文在计算平均值的时候,中心点就是原点,所以μ等于0,得到图15的函数:
图15 简化一维高斯函数
我们根据图15的表达式,将其推导至二维空间,便可用于二维图像的处理,如图16所示:
图16 简化二维高斯函数
在二维空间中,正态分布的图像如图17所示:
图17 二维正态分布
有了上述知识铺垫,让我们来计算一个3 * 3高斯模糊的卷积核。假设卷积核中心点坐标为(0,0),即原点为中心点,其他点坐标如图18所示:
图18 卷积核点坐标
作者:两行哥
链接:https://www.jianshu.com/p/843254751331