您的位置:首页 > 运维架构

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

2014-12-12 21:52 543 查看
sobel边缘检测(导数运算)

主要函数Sobel()

#include<opencv2/opencv.hpp>
#include<iostream>
#include<string>

using namespace std;
using namespace cv;

void showImg(const string &win_name,const Mat &img)
{
namedWindow(win_name,CV_WINDOW_AUTOSIZE);
imshow(win_name,img);
}

int main(int argc,char **argv)
{
if((argc-2)!=0)
return -1;
Mat src=imread(argv[1]);
if(src.empty())
return -2;
GaussianBlur(src,src,Size(3,3),0,0,BORDER_DEFAULT);

showImg("Src",src);

Mat src_gray;
cvtColor(src,src_gray,CV_RGB2GRAY);

Mat grad;
Mat grad_x,grad_y;
Mat abs_grad_x,abs_grad_y;
int ddepth=CV_16S;
int delta=0;
int scale=1;

Sobel(src_gray,grad_x,ddepth,1,0,3,scale,delta,BORDER_DEFAULT);
convertScaleAbs(grad_x,abs_grad_x);

Sobel(src_gray,grad_y,ddepth,0,1,3,scale,delta,BORDER_DEFAULT);
convertScaleAbs(grad_y,abs_grad_y);

addWeighted(abs_grad_x,0.5,abs_grad_y,0.5,0,grad);

showImg("Reault",grad);

waitKey();
return 0;
}


应用高斯变换减少图像噪声;

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运算,但是效果就差强人人意了:



代码大同小异:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<string>

using namespace std;
using namespace cv;

void showImg(const string &win_name,const Mat &img)
{
namedWindow(win_name,CV_WINDOW_AUTOSIZE);
imshow(win_name,img);
}

int main(int argc,char **argv)
{
if((argc-2)!=0)
return -1;
Mat src=imread(argv[1]);
if(src.empty())
return -2;
GaussianBlur(src,src,Size(3,3),0,0,BORDER_DEFAULT);

showImg("Src",src);

Mat src_gray;
cvtColor(src,src_gray,CV_RGB2GRAY);

Mat grad;
Mat grad_x,grad_y;
Mat abs_grad_x,abs_grad_y;
int ddepth=CV_16S;
int delta=0;
int scale=1;

Scharr(src_gray,grad_x,ddepth,1,0,scale,delta,BORDER_DEFAULT);
convertScaleAbs(grad_x,abs_grad_x);
showImg("X",abs_grad_x);

Scharr(src_gray,grad_y,ddepth,0,1,scale,delta,BORDER_DEFAULT);
convertScaleAbs(grad_y,abs_grad_y);
showImg("Y",abs_grad_y);

addWeighted(abs_grad_x,0.5,abs_grad_y,0.5,0,grad);

showImg("Reault",grad);

waitKey();
return 0;
}


以上。

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







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: