copyMakeBorder
在滤波中,有两个⾮常重要的基本⼯具函数,copyMakeBorder和borderInterpolate
copyMakeBorder中国朝代时间
函数原型
过节作文void copyMakeBorder( const Mat& src, Mat& dst,
int top, int bottom, int left, int right,
小熊英语
int borderType, const Scalar& value=Scalar() );
源码在utils.cpp中
功能
扩充src的边缘,将图像变⼤,然后以各种外插⽅式⾃动填充图像边界,这个函数实际上调⽤了函数cv::borderInterpolate,这个函数最重要的功能就是为了处理边界,⽐如均值滤波或者中值滤波中,使⽤copyMakeBorder将原图稍微放⼤,然后我们就可以处理边界的情况了
其中:
src,dst:原图与⽬标图像
圈子决定格局top,bottom,left,right分别表⽰在原图四周扩充边缘的⼤⼩
borderType:扩充边缘的类型,就是外插的类型,中给出以下⼏种⽅式
* BORDER_REPLICATE
* BORDER_REFLECT
* BORDER_REFLECT_101
* BORDER_WRAP
* BORDER_CONSTANT
实际中,还有其他的宏定义
//! various border interpolation methods马坝人遗址
enum { BORDER_REPLICATE=IPL_BORDER_REPLICATE, BORDER_CONSTANT=IPL_BORDER_CONSTANT,
BORDER_REFLECT=IPL_BORDER_REFLECT, BORDER_WRAP=IPL_BORDER_WRAP,
带牛的成语BORDER_REFLECT_101=IPL_BORDER_REFLECT_101, BORDER_REFLECT101=BORDER_REFLECT_101, BORDER_TRANSPARENT=IPL_BORDER_TRANSPARENT,
BORDER_DEFAULT=BORDER_REFLECT_101, BORDER_ISOLATED=16 };
这⼏种⽅式到底什么意思呢?
OpenCV给出了解释:
代码来⾃源码:filter.cpp
你好我好大家好/*
Various border types, image boundaries are denoted with '|'
* BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
* BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
* BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
* BORDER_WRAP: cdefgh|abcdefgh|abcdefg
* BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified 'i'
*/
个⼈觉得OpenCV解释的还是挺形象的
这⾥我们重点看下⾯这⾮常常见的⼏种
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
如上图,红⾊区域为src的最边界像素,蓝⾊区域是扩充的边界,我们将边缘扩⼤了5个像素(right=5),蓝⾊区域的宽度就是5,复制了5次红⾊区域的值
这种⽅式也就是OpenCV中的中值滤波medianBlur采⽤的边界处理⽅式
BORDER_REFLECT_101:对称法,也就是以最边缘像素为轴,对称。
下⾯我们看图
绿⾊区域是src最边界的像素,蓝⾊区域是我们扩充的5个像素的扩充边界,⽽红⾊区域就是蓝⾊区域在src的对称部分
三角形的公式
这种⽅式也是OpenCV边界处理的默认⽅式(BORDER_DEFAULT=BORDER_REFLECT_101)
也是filter2D,blur,GaussianBlur,bilateralFilter的默认处理⽅式,所以这种⽅式在边界处理中应⽤还是⾮常⼴泛的BORDER_CONSTANT:常量法。
常量法就是以⼀个常量像素值(由参数 value给定)填充扩充的边界值,这种⽅式在仿射变换,透视变换中⾮常常见
如下图,