在OpenCV里实现二维离散卷积1

在前面学习的内容主要是对图像进行增强的操作,不过图像可能还有某种干扰的像素,这些像素可能是由噪声引起的,噪声可以理解为由一种或多种原因造成的灰度值的随机变化,比如电磁波通讯时受到干扰。为了解决这个问题,在大多数情况之下,通过平滑技术(或称为滤波技术)进行抑制或者消除,常用的平滑处理算法包括二维离散卷积的高斯平滑、均值平滑,基于统计方法的中值平滑等等。在进行平滑算法之前,先来温习一下二维离散卷积的处...

在OpenCV里实现二维离散卷积1

在前面学习的内容主要是对图像进行增强的操作,不过图像可能还有某种干扰的像素,这些像素可能是由噪声引起的,噪声可以理解为由一种或多种原因造成的灰度值的随机变化,比如电磁波通讯时受到干扰。为了解决这个问题,在大多数情况之下,通过平滑技术(或称为滤波技术)进行抑制或者消除,常用的平滑处理算法包括二维离散卷积的高斯平滑、均值平滑,基于统计方法的中值平滑等等。

在进行平滑算法之前,先来温习一下二维离散卷积的处理过程,假设有下面两个二维矩阵:

图像的像素组成的矩阵为x,这是一个5X5的矩阵,然后要使用一个卷积核为h,这是一个3X3的矩阵,要对这个图像进行卷积运算需要进行下面的操作。

第一步:将矩阵逆时针翻转180度。

在这个操作过程里,先按行进行翻转,然后再按列进行翻转,就可以得到相乘的矩阵。

第二步:矩阵元素相乘累加

把逆转的矩阵按行优先,一个元素一个元素地移动进行相乘累加操作,两个矩阵最先相交的位置就是卷积核的矩阵元素1与图像元素矩阵元素25,进行25X1=25的操作,把这个结果保存到新的数组里。接着再往右边移动一个元素,就是移动一格,这时有两个元素相交(0,1)与(25,100),进行这样的操作:25X0100X1 = 100,再把100保存新的数组y里。按这样的步骤继续往右边移动。

继续往右边移动,就会生成c图里的y数组输出,当最后一个元素相交时,也跟第一个元素碰到的时候一样计算,按d图里这样计算。这里把一行操作完成了,接着下一步的操作,就是卷积核向下移动一行,相当于移动一行像素,如下图:

在a图里进行25 � 050 � 1 = 50计算,就把50写到下面的输出数组y里,继续往右边移动,在这里相交时按计算,49 � 0130 � 170 � 1100 � 0 = 200。

继续往下和往右边进行操作,就会碰到下面三行的操作:

继续往下面操作,就会遇到下面的情况:

这样就剩下卷积核上面元素与图像矩阵相交了。

经过完整的操作之后,就输出矩阵y,这个就是卷积处理之后的结果,也就是新图像的结果。

可以把卷积操作的数学公式总结为:

在这个公式里,y是输出图像矩阵,h是卷积核矩阵,x是输入图像矩阵,i和j是输出矩阵的位置,m和n是卷积核的位置,比如上面3X3的矩阵,m和n的取值范围就是-1到1,因此在3X3矩阵核之下,可以把公式写这样:

如果要使用这个公式来计算,会发现计算第一个元素时有困难,那么就需要开动脑筋了,在图像的周围补充一些像素,比如补0,如下图:

在b图里左上角里补了很多0,这样计算结果是一样的。因此可以把图像补充如下图一样:

这样就可以使用上面的公式来计算卷积运算了,不过这里是使用0来填充边界,其实也可以使用其它方式来填充的,比如边界元素扩充,边界镜像等等。到这里就完成了图像的卷积运算,以及边界填充的技术。

https://blog.csdn.net/caimouse/article/details/51749579

源文地址:https://www.guoxiongfei.cn/csdn/7966.html