构建边界;
因为做图像卷积的时候在图片边缘的像素按照公式是无法计算的,因此需要在边缘构建边界进行计算;
在opencv中构建边界的函数是:copyMakeBorder(src,dst,top,bottom,left,right,borderType,values);
先来代码:
1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 using namespace cv; 7 8 int main(int argc,char **argv) 9 { 10 if((argc-2)!=0) 11 { 12 cout<<"Usage: ./makeBorder \"image_name\""<<endl; 13 return 0; 14 } 15 16 Mat src=imread(argv[1]); 17 if(src.empty()) 18 { 19 cout<<"Has not found image"<<endl; 20 return -1; 21 } 22 23 namedWindow("Src",CV_WINDOW_AUTOSIZE); 24 imshow("Src",src); 25 26 Mat dst; 27 RNG rng(12345); 28 Scalar values; 29 int top; 30 int bottom; 31 int left; 32 int right; 33 char c; 34 int borderType; 35 36 top=(int)(0.05*src.rows); 37 bottom=(int)(0.05*src.rows); 38 left=(int)(0.05*src.cols); 39 right=(int)(0.05*src.rows); 40 41 while(true) 42 { 43 c=waitKey(500); 44 if((char)c==27) 45 break; 46 //borderType=BORDER_CONSTANT; 47 borderType=BORDER_REPLICATE; 48 values=Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)); 49 copyMakeBorder(src,dst,top,bottom,left,right,borderType,values); 50 51 namedWindow("Dst",CV_WINDOW_AUTOSIZE); 52 imshow("Dst",dst); 53 } 54 55 waitKey(); 56 return 0; 57 }
同样的CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8) 2 project( makeBorder.cpp ) 3 find_package( OpenCV REQUIRED ) 4 add_executable( makeBorder makeBorder.cpp ) 5 target_link_libraries( makeBorder ${OpenCV_LIBS} )
将borderype类型分别取值时,结果分别是:
可以看出两个参数不同在于,前者是使用自行构建的像素进行填充,后者是将边缘像素拓展。当然,看上去是后者比较好看。
函数参数的说明就不多叙了,字面上可以自己理解。
以上。
时间: 2024-11-04 07:21:48