码迷,mamicode.com
首页 > 其他好文 > 详细

OpenCV官方文档学习记录(13)

时间:2014-12-12 22:10:52      阅读:290      评论:0      收藏:0      [点我收藏+]

标签: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三幅图像如下:

bubuko.com,布布扣

 

如果看不真切:

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

 

 

同时,我们也可以使用Scharr函数进行三阶kernel运算,但是效果就差强人人意了:

bubuko.com,布布扣

代码大同小异:

 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 }

 

以上。

 

附加:代码中使用的矩阵:

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

OpenCV官方文档学习记录(13)

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/lhyz/p/4160518.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!