opencv(21) 边界填充

前面我们学习了图像的卷积操作。一个很自然的问题是如何处理卷积边缘。当卷积点在图像边界时会发生什么,如何处理这个问题?

大多数用到卷积操作的OpenCV函数都是将给定图像拷贝到另一个轻微变大的图像中,然后自动填充图像边界(通过下面示例代码中的各种方式)。这样卷积操作就可以在边界像素安全执行了(填充边界在操作完成后会自动删除)。

1 cv2.copyMakeBorder() 边界填充函数

作用:将源图像复制到目标图像的中间并在图像周围形成边框。如果你想给你的图片设置边界框,就像一个相框一样的东西,你就可以使用cv2.copyMakeBorder()函数。但其在卷积操作、零填充等也得到了应用,并且可以用于一些数据增广操作。

原型:cv2.copyMakeBorder(img,top, bottom, left, right ,borderType,[value])

参数:

  1. img 输入的图片
  2. top, bottom, left, right 图片相应方向上的边框宽度,以像素为单位
  3. borderType定义要添加边框的类型,它可以是以下的一种:
    1. cv2.BORDER_REPLICATE:复制法,复制图像最边缘的像素,使用最边界的像素值代替,类似于aaaaaa|abcdefgh|hhhhhhh
    2. cv2.BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制,添加的边框像素将是边界元素的镜面反射,类似于fedcba|abcdefgh|hgfedc
    3. cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT:反射法,以最边缘的像素为轴,对称。和上面类似,但是有一些细微的不同,类似于gfedcb|abcdefgh|gfedcba
    4. cv2.BORDER_WRAP:外包装法,直接看吧,cdefgh|abcdefgh|abcdefg
    5. cv2.BORDER_CONSTANT:常量法,常数值填充。添加的边界框像素值为常数(需要额外再给定一个参数)

      4.value如果borderType为cv2.BORDER_CONSTANT时需要填充的常数值

2 示例

import cv2
import matplotlib.pyplot as plt

img = 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([])

运行结果如下:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值