OpenCV(16):边界填充

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

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

16.1 cv2.copyMakeBorder()边界填充

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

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

参数:

  1. img 输入的图片
  2. top, bottom, left, right 图片相应方向上的边框宽度,以像素为单位
  3. 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时需要填充的常数值

16.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([])

16.3 细节函数

为了能快速对比出各个方法得出的图像的区别,可以使用np.vstack()或者np.hstack()对比,将图像放在同一个窗口。

  • rec=np.hstack((replicate,reflect))
  • cv_show("replicate_reflect",rec)

注意

  1. 使用np.vstack()或者np.hstack()函数时,图像的大小必须一致,不然会报错。
  2. 使用np.vstack()或者np.hstack()函数时,可能会出现图像显示不完全情况
在图像处理领域中,OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了很多在图像和视频分析上的功能。图像的边界填充是指对图像边缘进行扩展,并对扩展部分赋予一定的值,这样在对图像进行卷积操作等过程中可以避免边界效应。 在OpenCV中,边界填充可以通过`cv2.copyMakeBorder()`函数来实现。该函数可以将源图像复制到新图像中,并在源图像的四周根据设定的参数进行边界填充填充参数包括边界类型、边界的宽度以及填充的颜色值等。 边界填充类型主要分为以下几种: - `BORDER_CONSTANT`:使用固定值进行填充。 - `BORDER_REFLECT`:边界反射填充。 - `BORDER_REFLECT_101` 或 `BORDER_DEFAULT`:边界反射填充,但左右对称。 - `BORDER_REPLICATE`:复制最边缘的值。 - `BORDER_WRAP`:周期性填充。 以下是一个简单的示例代码,展示了如何使用`copyMakeBorder`函数进行边界填充: ```python import cv2 import numpy as np # 读取一张图片 image = cv2.imread('example.jpg') # 设置边界填充的参数 top, bottom, left, right = 10, 10, 10, 10 border_type = cv2.BORDER_CONSTANT value = (255, 255, 255) # 白色填充 # 执行边界填充 extended_image = cv2.copyMakeBorder(image, top, bottom, left, right, border_type, value=value) # 显示原图和填充后的图像 cv2.imshow('Original image', image) cv2.imshow('Extended image', extended_image) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值