昊虹AI笔记网

 找回密码
 立即注册
搜索
查看: 12995|回复: 0
收起左侧

图像处理作窗口运算时边界的几种扩展方法(详解OpenCV中的参数borderType)

[复制链接]

251

主题

254

帖子

1147

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1147
昊虹君 发表于 2022-12-22 11:27 | 显示全部楼层 |阅读模式
图像处理作窗口运算时边界的几种扩展方法(详解OpenCV中的参数borderType)

上一篇博文在讲述“窗口、核算子、模板、结构、卷积核、高斯核、锚点”的概念时,涉及到了边界扩展的概念,详情见链接 https://www.hhai.cc/thread-177-1-1.html

当窗口在图像的边缘滑动时,窗口将有部分覆盖不到原图像的像素,这时我们就需要扩展图像的边界。

按照OpenCV中borderType的取值来看,通常有以下几种扩展方法:
  • BORDER_CONSTANT
  • BORDER_REPLICATE
  • BORDER_REFLECT
  • BORDER_WRAP
  • BORDER_REFLECT_101
  • BORDER_TRANSPARENT
  • BORDER_ISOLATED

下面这张截图把上面的扩展方法讲得比较清楚了:
注意,截图中的第一根竖线“|”代表图像的左边界,第二根竖线“|”代表图像的右边界。

上面的截图已经把这个问题说得比较清楚了,如果还有不明白的地方,可参考博文 https://blog.csdn.net/shuiyixin/article/details/106472722

补充说明几点:
关于BORDER_CONSTANT:这是以常数的方式作边界扩展,默认值为0。并不是OpenCV中的每个函数可以设置这个常数值的,比如函数copyMakeBorder()是可以设置这个常数值的,其原型如下:
  1. void cv::copyMakeBorder(InputArray src,
  2.                         OutputArray dst,
  3.                         int top,
  4.                         int bottom,
  5.                         int left,
  6.                         int right,
  7.                         int borderType,
  8.                         const Scalar & value = Scalar() )
复制代码

上面原型中的参数value便是设置这个常数值的参数,示例代码如下:
  1. copyMakeBorder(YT, YT_new, top, bottom, left, right, BORDER_CONSTANT, Scalar(21, 222, 214));
复制代码

但是函数filter2D()就不能设置这个常数,其原型如下:
  1. void cv::filter2D(InputArray src,
  2.                   OutputArray dst,
  3.                   int ddepth,
  4.                   InputArray kernel,
  5.                   Point anchor = Point(-1,-1),
  6.                   double delta = 0,
  7.                   int borderType = BORDER_DEFAULT )
复制代码

从这个原型中可以看出,函数filter2D()并不能设置这个常数值的参数。

关于BORDER_DEFAULT:这个值等效于BORDER_REFLECT_101,而不是很多同学想像的以常数0作为扩展填充。

关于BORDER_ISOLATED:当我们处理的对象是完整的图像或矩阵而不是ROI区域时,它等同于BORDER_CONSTANT以0值作填充;当处理的对象是ROI区域时,它无视ROI区域外的图像值或矩阵值,而以0值对ROI区域作边界扩展处理。

关于BORDER_TRANSPARENT:这个在OpenCV4中已经被取消了。
在OpenCV4中运行下面这条语句,会报错:
  1. B1 = cv.copyMakeBorder(A1, 3, 3, 3, 3, borderType=cv.BORDER_TRANSPARENT)
复制代码

报错如下:
  1. cv2.error: OpenCV(4.1.2) C:\projects\opencv-python\opencv\modules\core\src\copy.cpp:934: error: (-5:Bad argument) Unknown/unsupported border type in function 'cv::borderInterpolate'
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|昊虹AI笔记网 ( 蜀ICP备2024076726 )

GMT+8, 2025-11-15 05:10 , Processed in 0.020786 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表