作者:翟天保Steven
著作權宣告:著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處
函式原型
void Sobel( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, int ksize = 3,
double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
引數說明
- InputArray型別的image,輸入影像,8位影像,
- OutputArray型別的dst,輸出影像,
- int型別的ddepth,輸出影像的深度,若src為CV_8U,則可取-1/CV_16S/CV_32F/CV_64F;若src為CV_16U/CV_16S,可取-1/CV_32F/CV_64F;若src為CV_32F,可取-1/CV_32F/CV_64F;若src為CV_64F,可取-1/CV_64F,
- int型別的dx,x方向上的差分階數,
- int型別的dy,y方向上的差分階數,
- int型別的ksize,默認值為3,表示Sobel核的大小,取奇數,
- double型別的scale,計算導數值時選的縮放因子,默認為1,
- double型別的delta,表示在結果存入目標圖之前可選的delta值,默認為0,
- int型別的borderType,邊界模式,
函式原理
Sobel算子是一個主要用于邊緣檢測的離散微分算子,它結合了高斯平滑和微分求導,用來計算影像灰度函式的近似梯度,在影像的任何一點使用此算子,都會產生對應的梯度矢量或法矢量,
Soble算子的計算步驟:
1.假設影像為I,分別在x和y方向求導,
1)水平方向將I與一個奇數大小的內核進行卷積,所得結果為Gx:
2)垂直方向將I與一個奇數大小的內核進行卷積,所得結果為Gy:
2.在影像的每一點,結合Gx和Gy求出近似梯度G:
測驗代碼
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("test.jpg");
Mat gradx, grady, absgradx, absgrady, result;
// X方向梯度
Sobel(src, gradx, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(gradx, absgradx);
// Y方向梯度
Sobel(src, grady, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(grady, absgrady);
// 梯度相加
addWeighted(absgradx, 0.5, absgrady, 0.5, 0, result);
// 結果顯示
imshow("src", src);
imshow("x", absgradx);
imshow("y", absgrady);
imshow("result", result);
waitKey(0);
return 0;
}
測驗效果
因為Sobel算子結合了高斯平滑和分化,所以結果具備一定抗噪性哦~
如果文章幫助到你了,可以點個贊讓我知道,我會很快樂~加油!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345590.html
標籤:其他
