二维图像处理中的可分离卷积核
本文参考书籍《Opencv算法精解》,作者:张平
如果一个卷积核至少由两个尺寸比它小的卷积核full卷积而成,并且在计算过程中在所有边界处均进行扩充零的操作,且满足
其中的尺寸比
小,
,则称该卷积核是可分离的。
在二维图像处理中经常将一个卷积核分为一维水平方向和一维垂直方向上的两个卷积核,例如:
举例计算:
将卷积符号后面的矩阵当作卷积核,前面的矩阵当作图像。首先将卷积核逆时针旋转180度得到如下矩阵:
计算过程中图像不动,按照先行后列的顺序移动卷积核,对应位置相乘然后求和。具体计算过程如下图所示:
计算结果即为分离前的卷积核。注意full卷积是不满足交换律的,但是一维水平方向和一维垂直方向上的卷积核的full卷积是满足交换律的。
如果卷积核Kernel是可分离的,且,则有:
假设图像矩阵的尺寸为
,卷积核Kernel的尺寸为
,那么进行same卷积的运算量大概为
,即复杂度为
。如果将卷积核分离为一维水平方向上
的卷积核和一维垂直方向上的
的卷积核,运算的复杂度减少为
,随着卷积核尺寸的增大,分离卷积核的运算优势更加明显。
高斯卷积核和均值卷积核都是可分离的,高斯卷积核的构建可参考我的另一篇博客。接下来主要讲解分离均值卷积核与图像卷积的操作步骤,均值卷积核可分解为如下形式:
第一步:假设有一副尺寸为3*3的图像,想要使用尺寸为3*3的卷积核进行均值滤波,对其进行边界扩充后(灰色部分为扩充的边界像素)表示如下:
第二步:使用一维水平方向上的卷积核 ,对边界扩充后的图像进行卷积,得到一个中间结果(由于卷积核宽度为3,因此第一列和最后一列无法进行卷积运算,因此保持初始化的值为0),如下所示:
第三步:使用一维垂直方向上的卷积核,对中间结果图像进行卷积(由于卷积核高度为3,因此第一行和最后一行无法进行卷积运算,因此保持初始化的值为0),如下所示:
第四步:将两次卷积得到的结果除以卷积核的面积,并赋值给结果图像,如下所示:
注意:在实际编程中,第三步和第四步通常合并到一起实现,提高算法效率