OpenCV使用教程-图像边界填充

1、常见填充方法说明:

  • 复制法,也就是复制最边缘的像素
replicate=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REPLICATE)
  • 反射法,54321|1234567|76543
reflect=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REFLECT)
  • 反射法,65432|1234567|65432 以1、7为轴
reflect101=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REFLECT_101)
  • 外包装法,34567|1234567|12345
wrap=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_WRAP)
  • 常量法,常量值填充
constant=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_CONSTANT,value=0)

2、 案例展示:

  • 声明窗口规格为(2✖️3),1表示位置为1号位
plt.subplot(2,3,1)
  • 需要展示的子图片
plt.imshow(img,'gray')
  • 设置子图片标题
plt.title('ORIGINAL')
  • 展示图片集
plt.show()

展示案例如下:

import cv2 as cv
img=cv.imread("../sources/cyq.jpg", cv.IMREAD_COLOR)
top_size,bottom_size,left_size,right_size=(50,50,50,50)
# 复制法,也就是复制最边缘的像素
replicate=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REPLICATE)
# 反射法,54321|1234567|76543
reflect=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REFLECT)
# 反射法,65432|1234567|65432 以1、7为轴
reflect101=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REFLECT_101)
# 外包装法,34567|1234567|12345
wrap=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_WRAP)
# 常量法,常量值填充
constant=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_CONSTANT,value=0)

import matplotlib.pyplot as plt
plt.subplot(2,3,1),plt.imshow(img,'gray'),plt.title('ORIGINAL')
plt.subplot(2,3,2),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(2,3,3),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(2,3,4),plt.imshow(reflect101,'gray'),plt.title('reflect101')
plt.subplot(2,3,5),plt.imshow(wrap,'gray'),plt.title('wrap')
plt.subplot(2,3,6),plt.imshow(constant,'gray'),plt.title('constant')
plt.show()

代码运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 OpenCV 中,高斯滤波可以使用函数 `GaussianBlur()` 实现。该函数支持自动填充边界,可以使用 `BORDER_DEFAULT` 参数指定边界填充方式,具体用法如下: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat src = imread("input.jpg"); Mat dst; GaussianBlur(src, dst, Size(5, 5), 0, 0, BORDER_DEFAULT); imshow("input", src); imshow("output", dst); waitKey(); return 0; } ``` 其中 `Size(5, 5)` 指定了高斯核的大小,第五个参数为 0 表示根据核大小自动计算高斯函数的标准差,第六个参数 `BORDER_DEFAULT` 指定了边界填充方式为默认方式,即使用复制边界的方式进行填充。如果需要使用其他的边界填充方式,可以选择以下常量: - `BORDER_CONSTANT`:使用常量填充边界。 - `BORDER_REFLECT`:以边界为对称轴,对超出边界的像素进行镜像。 - `BORDER_REFLECT_101`:与 `BORDER_REFLECT` 类似,但不包括边界本身。 - `BORDER_REPLICATE`:复制边界像素。 - `BORDER_WRAP`:像素超出边界时使用另一端的像素进行填充。 例如,如果需要使用常量填充边界,可以使用以下代码: ```c++ GaussianBlur(src, dst, Size(5, 5), 0, 0, BORDER_CONSTANT, Scalar(0, 0, 0)); ``` 其中 `Scalar(0, 0, 0)` 指定了常量填充的像素值为黑色。 ### 回答2: 在使用OpenCV进行高斯滤波时,填充边界是一种常用的处理方式。当我们对图像应用高斯滤波时,我们需要在图像边界处进行填充,以避免边界像素受到滤波器的影响导致失真。 填充边界的方法有不同的选择。一种常见的方法是零填充(Zero Padding),即在原始图像边界周围添加一个由零像素组成的边界。这可以通过调用`cv2.copyMakeBorder`函数来实现。通过指定填充的宽度和高度,我们可以决定在图像的四个边界周围添加多少行和列的零像素。 例如,如果我们的原始图像是一个300x300的图像,我们可以选择在边界周围各自添加30个像素,这样我们的新图像大小将是360x360。通过这样的填充,我们可以保证在应用高斯滤波之前,边界像素周围没有超过原始图像范围的像素。 然后,我们可以使用`cv2.GaussianBlur`函数来对填充后的图像应用高斯滤波。通过指定高斯滤波器的核大小和标准差,我们可以控制滤波器的强度和模糊程度。滤波后的图像将包含平滑的像素值,而边界像素不会受到过多的影响。 总之,使用OpenCV进行高斯滤波时,我们需要使用填充边界的技术来处理图像边界处的像素。这样可以确保滤波器的效果不会失真,并且可以得到准确的滤波结果。 ### 回答3: OpenCV的高斯滤波是一种常用的图像处理技术,可以用于平滑图像并减少噪声。在进行高斯滤波时,有时我们需要填充边界像素。 填充边界是为了防止在进行滤波操作时出现图像边缘信息的丢失。因为高斯滤波是通过计算像素周围区域的平均值来得到新的像素值,如果不填充边界,那些位于边缘的像素的周围区域可能会超出图像的范围,导致无法计算得到正确的像素值。 为了解决这个问题,OpenCV在进行高斯滤波时提供了填充边界的选项。在使用高斯滤波函数`cv2.GaussianBlur()`时,我们可以通过设置`borderType`参数来指定边界填充的方式。 常用的边界填充方式有以下几种: 1. `BORDER_REPLICATE`:使用边界像素值进行填充。即将边界像素值复制到超出范围的区域。 2. `BORDER_CONSTANT`:使用常数进行填充。可以通过设置`borderValue`参数指定填充的常数值。 3. `BORDER_REFLECT`:使用边界像素的镜像进行填充。将边界处的像素值复制到超出范围的区域,超出部分的像素值为镜像。 通过选择合适的边界填充方式,我们可以在进行高斯滤波时避免边缘信息的丢失,得到更好的滤波效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值