做网站用什么软件免费,主题网站开发介绍,电脑游戏排行榜2020前十名,推广网站出现中性产品文章目录 前言一、原理二、具体的实现 前言
在Python中使用OpenCV进行边界填充#xff08;也称为zero padding#xff09;是一种常见的图像处理操作#xff0c;通常用于在图像周围添加额外的像素以便进行卷积或其他操作。下面是使用OpenCV进行边界填充的基本原理和方法
一… 文章目录 前言一、原理二、具体的实现 前言
在Python中使用OpenCV进行边界填充也称为zero padding是一种常见的图像处理操作通常用于在图像周围添加额外的像素以便进行卷积或其他操作。下面是使用OpenCV进行边界填充的基本原理和方法
一、原理
边界填充的原理是在图像的周围添加一圈像素这些像素的值通常设置为0因此称为zero padding。这样做的目的是为了确保在对图像进行卷积等操作时边界像素也能够得到正确的处理而不会出现边界效应导致输出图像尺寸减小的情况。 这怎么理解呢让我们通过一个简单的例子来说明 假设我们有一张 5x5 的灰度图像如下所示 我们想要对这个图像进行 3x3 的均值滤波即每个像素的值都取其周围 3x3 区域像素值的平均值。假设我们的卷积核是一个全1的 3x3 矩阵。 进行卷积操作时我们将卷积核从左上角开始依次移动到图像的每个像素位置对应位置的输出像素值计算如下 对于位置(1,1)与卷积核重叠的像素为 算这些像素的平均值得到输出像素值为(123678111213) / 9 7.444 同样的方法我们可以得到输出图像中其他位置的像素值。然而当卷积核与图像边界相交时由于边界像素周围没有足够的像素可以计算平均值因此会出现边界效应。在上述例子中当卷积核位于图像的左上角时它与图像的左边界和上边界相交导致无法计算边界像素的周围像素值因此无法得到正确的输出像素值。 为了解决边界效应常见的方法之一是通过在图像周围添加额外的像素即边界填充zero padding从而确保卷积核在图像边界处能够正确应用。
二、具体的实现
代码如下示例
image cv2.imread(./img/dog21.png)
imagecv2.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, value0)# 使用边界复制
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), sharexTrue, shareyTrue)# 显示图像
ax1.imshow(image.copy())
ax1.set_title(original)
ax2.imshow(bordered_image_constant)
ax2.set_title(constant)
ax3.imshow(bordered_image_replicate, cmapgray)
ax3.set_title(replicate)
ax4.imshow(bordered_image_reflect, cmapgray)
ax4.set_title(reflect)
ax5.imshow(bordered_image_reflect_101, cmapgray)
ax5.set_title(reflect_101)
ax6.imshow(bordered_image_wrap, cmapgray)
ax6.set_title(wrap)
plt.show()
我们通过创建子图的方式显示我们创建一个2行3列的图片显示这样方面我们对比你也可以像之前那样一张张显示也行。 我们首先看下cv2.copyMakeBorder介绍
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