一、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);
}