上一篇博文在讲述“窗口、核算子、模板、结构、卷积核、高斯核、锚点”的概念时,涉及到了边界扩展的概念,详情见链接 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'