标签:style blog http io ar color os 使用 sp
sobel边缘检测(导数运算)
主要函数Sobel()
1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 using namespace cv; 7 8 void showImg(const string &win_name,const Mat &img) 9 { 10 namedWindow(win_name,CV_WINDOW_AUTOSIZE); 11 imshow(win_name,img); 12 } 13 14 int main(int argc,char **argv) 15 { 16 if((argc-2)!=0) 17 return -1; 18 Mat src=imread(argv[1]); 19 if(src.empty()) 20 return -2; 21 GaussianBlur(src,src,Size(3,3),0,0,BORDER_DEFAULT); 22 23 showImg("Src",src); 24 25 Mat src_gray; 26 cvtColor(src,src_gray,CV_RGB2GRAY); 27 28 Mat grad; 29 Mat grad_x,grad_y; 30 Mat abs_grad_x,abs_grad_y; 31 int ddepth=CV_16S; 32 int delta=0; 33 int scale=1; 34 35 Sobel(src_gray,grad_x,ddepth,1,0,3,scale,delta,BORDER_DEFAULT); 36 convertScaleAbs(grad_x,abs_grad_x); 37 38 Sobel(src_gray,grad_y,ddepth,0,1,3,scale,delta,BORDER_DEFAULT); 39 convertScaleAbs(grad_y,abs_grad_y); 40 41 addWeighted(abs_grad_x,0.5,abs_grad_y,0.5,0,grad); 42 43 showImg("Reault",grad); 44 45 waitKey(); 46 return 0; 47 }
应用高斯变换减少图像噪声;
Soblel函数用于计算横向和纵向梯度,
ddepth是图像深度,这里使用CV_16S防止溢出(这里的图像是CV_8U);
1,0或是0,1代表选择的是梯度方向;
3为计算梯度的矩阵的大小;
其余参数是使用的均为默认值。
为了将图像转换回CV_8U,需要使用convertScaleAbs(grad_y,abs_grad_y);
为了将两幅图像合并显示,使用addWeighted()函数,如果我没记错的话,参数0是delta值,就是在叠加像素上附加的值:
abs_grad_x,abs_grad_y,grad三幅图像如下:
如果看不真切:
同时,我们也可以使用Scharr函数进行三阶kernel运算,但是效果就差强人人意了:
代码大同小异:
1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 using namespace cv; 7 8 void showImg(const string &win_name,const Mat &img) 9 { 10 namedWindow(win_name,CV_WINDOW_AUTOSIZE); 11 imshow(win_name,img); 12 } 13 14 int main(int argc,char **argv) 15 { 16 if((argc-2)!=0) 17 return -1; 18 Mat src=imread(argv[1]); 19 if(src.empty()) 20 return -2; 21 GaussianBlur(src,src,Size(3,3),0,0,BORDER_DEFAULT); 22 23 showImg("Src",src); 24 25 Mat src_gray; 26 cvtColor(src,src_gray,CV_RGB2GRAY); 27 28 Mat grad; 29 Mat grad_x,grad_y; 30 Mat abs_grad_x,abs_grad_y; 31 int ddepth=CV_16S; 32 int delta=0; 33 int scale=1; 34 35 Scharr(src_gray,grad_x,ddepth,1,0,scale,delta,BORDER_DEFAULT); 36 convertScaleAbs(grad_x,abs_grad_x); 37 showImg("X",abs_grad_x); 38 39 Scharr(src_gray,grad_y,ddepth,0,1,scale,delta,BORDER_DEFAULT); 40 convertScaleAbs(grad_y,abs_grad_y); 41 showImg("Y",abs_grad_y); 42 43 addWeighted(abs_grad_x,0.5,abs_grad_y,0.5,0,grad); 44 45 showImg("Reault",grad); 46 47 waitKey(); 48 return 0; 49 }
以上。
附加:代码中使用的矩阵:
标签:style blog http io ar color os 使用 sp
原文地址:http://www.cnblogs.com/lhyz/p/4160518.html