opencv—學習筆記6,sobel邊緣檢測

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

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章