进行卷积处理图片时,在图片的边界,核心没有足够元素纳入计算,OpenCV里用copyMakeBorder()函数将原图稍微放大,再开始进行卷积,OpenCV在空间滤波的 相关函数内部已包含copyMakeBorder()了,所以实际在使用空间滤波时,不需要呼叫copyMakeBorder()。
OpenCV里进行卷积时,处理边界问题通常分为3个步骤:
1,先将原始图片的资料,复制到稍大的图片中。
2,将边界外推,有几种BORDER形态决定外推值,以下列出几个常见的:
BORDER_CONSTANT: 外推的值为常数,常用在仿射变换、透视变换 中使用。
BORDER_REPLICATE: 外推的值和边界值相同,OpenCV的medianBlur默认的处理方式
BORDER_REFLECT_101: 外推像素值和边缘相同,OpenCV的 filter2D(卷积函数)、GaussianBlur(高斯滤波)、BilateralFilter(双边滤波)默认的处理方式。
3.处理完后将外推的部分切掉,使得输出图和输入图大小相同
copyMakeBorder()为上述的第一二步骤,就是输入来源图,得到一个稍大点外出图。
边界复制 void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left,int right, int borderType, const Scalar& value= Scalar());
-
src: 输入图
-
dst: 输出图,深度和输入图相同,尺寸会依赖输入参数而变得稍大,Size(src.colls+left+right,src.rows+top+bottom)。
-
top、bottom、left、right:上下左右分别外推多少像素
-
borderType:边线形态
-
value: 当borderType为BORDER_CONSTANT,此为外推的值
以下示例两种形态的边界扩充 :
Mat src = imread("test.jpg",CV_LOAD_IMAGE_UNCHANGE);
Mat dst1;
Mat dst2;
copyMakeBorder(src,dst1,5,5,5,5,BORDER_CONTANT,Scalar(255,0,0));
copyMakeBorder(src,dst2,5,5,5,5,BORDER_REPLICATE);
imshow("src_img",src);
imshow("dst1_img",dst1);
imshow("dst2_img",dst2);