八、计算机视觉-边界填充

文章目录


前言

在Python中使用OpenCV进行边界填充(也称为zero padding)是一种常见的图像处理操作,通常用于在图像周围添加额外的像素以便进行卷积或其他操作。下面是使用OpenCV进行边界填充的基本原理和方法

一、原理

边界填充的原理是在图像的周围添加一圈像素,这些像素的值通常设置为0,因此称为zero padding。这样做的目的是为了确保在对图像进行卷积等操作时,边界像素也能够得到正确的处理,而不会出现边界效应导致输出图像尺寸减小的情况。

这怎么理解呢,让我们通过一个简单的例子来说明:

假设我们有一张 5x5 的灰度图像如下所示:

我们想要对这个图像进行 3x3 的均值滤波,即每个像素的值都取其周围 3x3 区域像素值的平均值。假设我们的卷积核是一个全1的 3x3 矩阵。

进行卷积操作时,我们将卷积核从左上角开始依次移动到图像的每个像素位置,对应位置的输出像素值计算如下:

对于位置(1,1),与卷积核重叠的像素为:

算这些像素的平均值,得到输出像素值为:(1+2+3+6+7+8+11+12+13) / 9 = 7.444

同样的方法,我们可以得到输出图像中其他位置的像素值。然而,当卷积核与图像边界相交时,由于边界像素周围没有足够的像素可以计算平均值,因此会出现边界效应。在上述例子中,当卷积核位于图像的左上角时,它与图像的左边界和上边界相交,导致无法计算边界像素的周围像素值,因此无法得到正确的输出像素值。

为了解决边界效应,常见的方法之一是通过在图像周围添加额外的像素,即边界填充(zero padding),从而确保卷积核在图像边界处能够正确应用。

二、具体的实现

代码如下(示例):

python 复制代码
image = cv2.imread('./img/dog21.png')
image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
# 定义填充参数
top_border = 10
bottom_border = 10
left_border = 10
right_border = 10

# 使用常数填充,填充值为0
bordered_image_constant = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_CONSTANT, value=0)

# 使用边界复制
bordered_image_replicate = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_REPLICATE)

# 使用边界反射
bordered_image_reflect = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_REFLECT)

# 使用边界反射101
bordered_image_reflect_101 = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_REFLECT_101)

# 使用边界包裹
bordered_image_wrap = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_WRAP)




# 创建子图
fig, ((ax1, ax2, ax3),(ax4, ax5,ax6)) = plt.subplots(2, 3, figsize=(20, 10), sharex=True, sharey=True)



# 显示图像
ax1.imshow(image.copy())
ax1.set_title('original')
ax2.imshow(bordered_image_constant)
ax2.set_title('constant')
ax3.imshow(bordered_image_replicate, cmap='gray')
ax3.set_title('replicate')
ax4.imshow(bordered_image_reflect, cmap='gray')
ax4.set_title('reflect')
ax5.imshow(bordered_image_reflect_101, cmap='gray')
ax5.set_title('reflect_101')
ax6.imshow(bordered_image_wrap, cmap='gray')
ax6.set_title('wrap')
plt.show()

我们通过创建子图的方式显示,我们创建一个2行3列的图片显示,这样方面我们对比,你也可以像之前那样一张张显示也行。

我们首先看下cv2.copyMakeBorder介绍

python 复制代码
cv2.copyMakeBorder() 是 OpenCV 库中的一个函数,用于在图像周围创建边框。下面是该函数的参数及其解释:

src:要处理的输入图像。
top:在源图像的顶部添加的像素数目。
bottom:在源图像的底部添加的像素数目。
left:在源图像的左侧添加的像素数目。
right:在源图像的右侧添加的像素数目。
borderType:边框类型,可以是以下之一:
cv2.BORDER_CONSTANT:添加一个常量值的边框。此时需要提供一个value参数,用于指定常量值。
cv2.BORDER_REPLICATE:复制源图像的边界像素。
cv2.BORDER_REFLECT:对源图像的边界进行反射,比如:fedcba|abcdefgh|hgfedcb
cv2.BORDER_REFLECT_101:对源图像的边界进行反射,但略微不同,比如:gfedcb|abcdefgh|gfedcba
cv2.BORDER_WRAP:对源图像的边界进行包装,比如:cdefgh|abcdefgh|abcdefg
value(可选):当borderType为cv2.BORDER_CONSTANT时,指定的常量值。
该函数返回一个新的图像,其大小为原始图像加上指定边框大小,并且根据指定的边框类型进行填充。

执行返回如下:

上面参数中 主要就是borderType参数,

cv2.BORDER_CONSTANT:添加一个常量值的边框。此时需要提供一个value参数,用于指定常量值。这个最好理解,就是给边缘加一个边框 边框颜色就是value的值,如果是0就是黑色。

cv2.BORDER_REPLICATE:这个很好理解,就是边缘像素点向外复制。你可以看上图的第3图片的边缘 就能看出最外层一圈都是一个像素值

如下图

cv2.BORDER_REFLECT:对源图像的边界进行反射 你可以想象图片外部边缘为轴,把边缘像素对折到外部,如图:我们看底部填充的像素 就是图片最底部像素的一个反射,当然其他区域也是如此。就不一一显示了 。

cv2.BORDER_REFLECT_101:和上面差不多 只不过他是以边缘像素为轴进行反射 效果如图:

cv2.BORDER_WRAP:对源图像的边界进行包装,可以结合上面这些复制方法看下 这个复制也很好理解,是:cdefgh|abcdefgh|abcdefg

相关推荐
回眸&啤酒鸭2 天前
【回眸】Minicart 电商购物车核心功能落地指南
人工智能
一隅论数智2 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
AI的探索之旅2 天前
97 个 OpenCV 实例(三十):双目立体,从标定到点云
人工智能·opencv·计算机视觉
AlbertZein2 天前
Step-5-Preview 上手实测:3D 游戏、金融分析、网页设计一次跑完
人工智能·aigc
LaughingZhu2 天前
Product Hunt 每日热榜 | 2026-09-19
人工智能·深度学习·神经网络·搜索引擎·百度
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
wukangjupingbb2 天前
智能网联汽车安全能力框架
人工智能
龙亘川2 天前
明月照湾区,智启新赛道:从顶流文旅IP盛会看智慧文旅升级路径
人工智能·智慧城市·开源软件·数据可视化
飞猫的边缘AI2 天前
边缘AI应用:家用AI摄像头怎么做数据训练?
人工智能·边缘计算·ai算法·边缘ai