前面我们学习了图像的卷积操作。一个很自然的问题是如何处理卷积边缘。当卷积点在图像边界时会发生什么,如何处理这个问题?
大多数用到卷积操作的OpenCV函数都是将给定图像拷贝到另一个轻微变大的图像中,然后自动填充图像边界(通过下面示例代码中的各种方式)。这样卷积操作就可以在边界像素安全执行了(填充边界在操作完成后会自动删除)。
1 cv2.copyMakeBorder() 边界填充函数
作用:将源图像复制到目标图像的中间并在图像周围形成边框。如果你想给你的图片设置边界框,就像一个相框一样的东西,你就可以使用cv2.copyMakeBorder()
函数。但其在卷积操作、零填充等也得到了应用,并且可以用于一些数据增广操作。
原型:cv2.copyMakeBorder(img,top, bottom, left, right ,borderType,[value])
参数:
- img : 输入的图片
- top, bottom, left, right :图片相应方向上的边框宽度,以像素为单位
- borderType:定义要添加边框的类型,它可以是以下的一种:
- cv2.BORDER_REPLICATE:复制法,复制图像最边缘的像素,使用最边界的像素值代替,类似于aaaaaa|abcdefgh|hhhhhhh
- cv2.BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制,添加的边框像素将是边界元素的镜面反射,类似于fedcba|abcdefgh|hgfedc
- cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT:反射法,以最边缘的像素为轴,对称。和上面类似,但是有一些细微的不同,类似于gfedcb|abcdefgh|gfedcba
- cv2.BORDER_WRAP:外包装法,直接看吧,cdefgh|abcdefgh|abcdefg
- cv2.BORDER_CONSTANT:常量法,常数值填充。添加的边界框像素值为常数(需要额外再给定一个参数)
4.value:如果borderType为cv2.BORDER_CONSTANT时需要填充的常数值。
2 示例
import cv2
import matplotlib.pyplot as pltimg = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg')
img = cv2.merge((img[:,:,2],img[:,:,1],img[:,:,0]))
topSize,bottomSize,leftSize,rightSize=(100,100,100,100)
replicate = cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_CONSTANT,value=0)fig = plt.figure(figsize=(25.6,10)) # 设置画布大小
titles = ['ORIGINAL','REPLICATE','REFLECT','REFLECT_101','WRAP','CONSTANT,value=0']
images = [img,replicate,reflect,reflect101,wrap,constant]
for i in range(6): #画6次图
plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i],fontsize=30)
plt.xticks([]), plt.yticks([])
运行结果如下: