OpenCV4入门系列教程45:copyMakeBorder()

索引地址:系列索引

上一篇:OpenCV4入门系列教程测试5:旋转文本图像矫正

图像噪声介绍:图像噪声与去噪介绍

在OpenCV滤波算法中,有两个非常重要的基本工具函数,copyMakeBorder和borderInterpolate

copyMakeBorder函数原型:

1
2
3
4
void copyMakeBorder( const Mat& src, Mat& dst,
int top, int bottom, int left, int right,
int borderType,
const Scalar& value=Scalar());
  • src:原图
  • dst:目标图像
  • top,bottom,left,right分别表示在原图四周扩充边缘的大小
  • borderType:扩充边缘的类型,就是外插的类型,OpenCV中给出以下几种方式
    • 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’

|表示图像边界等等

功能:

扩充src的边缘,将图像变大,然后以各种外插方式自动填充图像边界,这个函数实际上调用了函数cv::borderInterpolate,这个函数最重要的功能就是为了处理边界,比如均值滤波或者中值滤波中,使用copyMakeBorder将原图稍微放大,然后我们就可以处理边界的情况了。

BORDER_REPLICATE:复制法,也就是复制最边缘像素。

这种方式也就是OpenCV中的中值滤波medianBlur采用的边界处理方式

BORDER_REFLECT_101:对称法,也就是以最边缘像素为轴,对称。

这种方式也是OpenCV边界处理的默认方式(BORDER_DEFAULT=BORDER_REFLECT_101)

也是filter2D,blur,GaussianBlur,bilateralFilter的默认处理方式,所以这种方式在边界处理中应用还是非常广泛的

BORDER_CONSTANT:常量法。

常量法就是以一个常量像素值(由参数 value给定)填充扩充的边界值,这种方式在仿射变换,透视变换中非常常见。

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "opencv2/opencv.hpp"

#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char* argv[]){
Mat img = imread("lena.jpg");
if(img.empty()){
cout<<"Nothin in image."<<endl;
return -1;
}
imshow("src",img);
Mat dst;

copyMakeBorder(img,dst,5,5,5,5,BORDER_REPLICATE,Scalar(255,255,0));
imshow("replicate",dst);
copyMakeBorder(img,dst,5,5,5,5,BORDER_REFLECT,Scalar(255,255,0));
imshow("reflect",dst);
copyMakeBorder(img,dst,5,5,5,5,BORDER_REFLECT_101,Scalar(255,255,0));
imshow("reflect_101",dst);
copyMakeBorder(img,dst,5,5,5,5,BORDER_WRAP,Scalar(255,255,0));
imshow("warp",dst);
copyMakeBorder(img,dst,5,5,5,5,BORDER_CONSTANT,Scalar(255,255,0));
imshow("const",dst);

waitKey(0);
return 0;
}

测试结果:

copymakeborder

除了warp和const比较明显外,其他几乎看不出来什么改变,代码待优化。

下一篇:OpenCV4入门系列教程46:线性滤波