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

文章目录


前言

在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

相关推荐
YSGZJJ22 分钟前
股指期货的套保策略如何精准选择和规避风险?
人工智能·区块链
无脑敲代码,bug漫天飞25 分钟前
COR 损失函数
人工智能·机器学习
HPC_fac130520678161 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
小陈phd4 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
Guofu_Liao5 小时前
大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结
人工智能·语言模型·自然语言处理·矩阵·llama
ZHOU_WUYI9 小时前
3.langchain中的prompt模板 (few shot examples in chat models)
人工智能·langchain·prompt
如若1239 小时前
主要用于图像的颜色提取、替换以及区域修改
人工智能·opencv·计算机视觉
老艾的AI世界9 小时前
AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
人工智能·深度学习·神经网络·机器学习·ai·ai翻唱·ai唱歌·ai歌曲
DK221519 小时前
机器学习系列----关联分析
人工智能·机器学习
Robot25110 小时前
Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速
人工智能·机器人·微信公众平台