opencv—学习笔记6,sobel边缘检测

来源:互联网 发布:全球十大金融公司知乎 编辑:程序博客网 时间:2024/06/09 15:59

一、sobel算子

1、是离散微分算子,用来计算图像灰度的近似梯度

2、sobel算子功能集合高斯平滑和微分求导

3、又被称为一阶微分算子、求导算子,在水平和垂直两个方向上求导,得到图像x方向与y方向梯度图像

这里写图片描述这里写图片描述

通过权重扩大差异

这里写图片描述 
有时也使用如下更简单的公式代替: (为增加计算速度)
这里写图片描述

4、求取导数近似值,Kernel=3时不时很准确,opencv使用改进版本scharr函数,算子如下:

这里写图片描述

二、API

CV:Sobel(

InputArray src//输入图像

OutputArray dst//输出图像,大小与输入图像一致(对应规则见下表)

int  depth   //输出图像深度

int   dx //x方向,几阶导数

int   dy//y方向,几阶导数

int ksize,sobel算子kernel大小必须是1、3、5、7(一般取3)

double scale=1

double  delta=0

int border Type=BORDER_DEFAULT

)

  • . InputArray src: 输入图像
  • . OutputArray dst: 输出图像
  • . int ddepth: 输出图像深度,与输入图像深度对应关系如下表所示: 
    这里写图片描述

三、代码:

#include<opencv2/opencv.hpp>

#include<highgui.h>
#include<iostream>


using  namespace  cv;
using namespace std;


Mat src,dst,gray,x_gray,y_gray;
int main(int argc,char**argv)
{
src=imread("1.jpg");
namedWindow("my picture",CV_WINDOW_AUTOSIZE);
imshow("my picture",src);
waitKey(100);


GaussianBlur(src,dst,Size(3,3),0,0,BORDER_DEFAULT);   //高斯降噪,平滑
cvtColor(dst,gray,COLOR_BGR2GRAY);   //转为灰度图
namedWindow("gray image",CV_WINDOW_AUTOSIZE);
imshow("gray image",gray);
waitKey(100);


Mat xgray,ygray;
Sobel(gray,x_gray,-1,1,0,3,1,0);
Sobel(gray,y_gray,-1,1,0,3,1,0);
convertScaleAbs(x_gray,x_gray);  //先缩放元素再取绝对值,最后转换格式为8bit型
convertScaleAbs(y_gray,y_gray);
imshow("xgray",x_gray);
imshow("ygray",y_gray);
waitKey(100);


/*Mat xygray;
addWeighted(x_gray,0.5,y_gray,0.5,0,xygray);   合并图像函数
imshow("xygray",xygray);*/
Mat xygray=Mat(xgray.size(),xgray.type());
//printf("type:%d",xgray.type ());


int width=xgray.cols;                         根据原理计算

int height=ygray.rows;
for (int row=0;row<height;row++){
for(int col=0;col<width;col++){
int xg=xgray.at <char>(row,col);    数据类型需注意选择合适的
int yg=ygray.at <char>(row,col);
int xy=xg+yg;
xygray.at<char>(row,col)=saturate_cast<char>(xy);
}
}
imshow("xygray",xygray);
waitKey(0);


return(0);

}