在使用opencv-python进行图像处理过程中,经常会使用卷积对图像进行滤波,在卷积运算过程中,卷积边缘如何处理经常让开发者感到略微困惑,现对此问题进行深入分析。我们使用最简单的滤波函数cv2.filter2D()进行分析,cv2.filter2D()函数的说明见链接,其中borderType指明用何种边缘处理方法,根据官方函数文档提示,有如下几个选项:
可见关于BORDER的选项有很多,但是在opencv的官方教程中并没有找到每一种BORDER的精确含义和说明,因此我们选择其中某几个进行测试。首先测试BORDER_CONSTANT,测试代码如下:
#源图像
src = np.uint8([[1,1,1,1,1],
[1,2,3,2,1],
[1,1,1,1,1],
[1,2,3,2,1],
[1,1,1,1,1]])
kernel = np.ones((3,3),np.float32)
dst = cv2.filter2D(src, -1, kernel,borderType=cv2.BORDER_CONSTANT)
print('src:', src)
print('dst:', dst)
print('kernel:', kernel)
程序运行的结果为:
我们对这一结果进行分析,我们首先看dst图像的第二行第二列元素,记为:dst(1,1)=12,其计算方式遵循卷积的定义,如下图所示:
因此处边缘外,目标图像dst中部像素值为:
当卷积核与src图像边缘进行卷积运算时,卷积核部分元素势必处于src外部,如下图所示:
现在的问题是:“?”的值都应该多少?根据运行结果,dst(0,0)的值为5,可知“?”中的值应该为0,即卷积核不在源图像范围内的元素值设置为0,入下图所示:



