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