图像处理作窗口运算时边界的几种扩展方法(详解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()是可以设置这个常数值的,其原型如下:
void cv::copyMakeBorder(InputArray src,
OutputArray dst,
int top,
int bottom,
int left,
int right,
int borderType,
const Scalar & value = Scalar() )
上面原型中的参数value便是设置这个常数值的参数,示例代码如下:
copyMakeBorder(YT, YT_new, top, bottom, left, right, BORDER_CONSTANT, Scalar(21, 222, 214));
但是函数filter2D()就不能设置这个常数,其原型如下:
void cv::filter2D(InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor = Point(-1,-1),
double delta = 0,
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中运行下面这条语句:
B1 = cv.copyMakeBorder(A1, 3, 3, 3, 3, borderType=cv.BORDER_TRANSPARENT)
时会报下面的错:
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'
相关文章
- 【OpenCV】边缘检测:Sobel、拉普拉斯算子
- OpenCV每日函数 特征检测和描述模块(7) AGAST类 (提取关键点和计算描述符)
- Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)最强详细攻略
- 成功解决sub_div.insert(points)cv2.error: OpenCV(3.4.1) C:projectsopencv-pythonopencvmodulesimgproc
- Win10+MinGW+OpenCV实现命令行编译
- QT 之Opencv视频播放(进度显示以及拖拽)
- Opencv图像处理:判断图片里某个颜色值占的比例
- 似乎只需要在cpp文件 #include<opencv2opencv.hpp> 就可以调用opencv里面所有的函数或者说函数接口了?
- opencv各种绘图 直线 矩形 圆 椭圆
- yolov4视频目标检测:使用C++版本联合CUDA11.2的OpenCV 5.x编译生成opencv-python==5.x进行推理
- ubuntu删除OpenCV
- 在OpenCV里学习常见问题汇编28
- 在OpenCV里学习常见问题汇编10
- 在OpenCV里实现内旋轮线
- 在OpenCV里打开视频文件并播放
- Opencv项目实战:17 贪吃蛇游戏
- 【课题总结】OpenCV 抠图项目实战(6)色彩范围抠图
- 【OpenCV 例程300篇】203. 伪彩色图像处理