OpenCV 基本邊緣檢測運算元Sobel實現

2021-08-15 14:50:42 字數 2056 閱讀 6956

簡要描述

sobel運算元主要用於獲得數字影象的一階梯度,常見的應用是邊緣檢測。

原理運算元使用兩個3*3的矩陣(圖1)運算元使用兩個3*3的矩陣(圖1)去和原始作卷積,分別得到橫向g(x)和縱向g(y)的梯度值,如果梯度值大於某乙個閾值,則認為該點為邊緣點

圖1:卷積矩陣

圖2:卷積運算  

影象直接卷積實現sobel:

//影象直接卷積實現sobel

bool sobeledge(const cv::mat image, cv::mat &result, uchar threshold)

}//計算梯度模長

gramag = sqrt(pow(edgex, 2) + pow(edgey, 2));

//二值化

result.at(i - 1, j - 1) = ((gramag > threshold) ? 255 : 0);

} }return true;

}

執行結果:

非極大值抑制sobel邊緣實現:

//非極大值抑制實現sobel豎直細化邊緣

bool sobelveredge(cv::mat image, cv::mat &result)

} resulttempmat.convertto(resulttempmat, cv_8uc1);

result = resulttempmat.clone();

return true;

}

執行結果:

在opencv中,sobel運算元在c++中的函式原型如下: 

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 src:輸入的原影象,mat型別 

outputarray dst:輸出的邊緣檢測結果影象,mat型,大小與原影象相同。 

int ddepth:輸出影象的深度,針對不同的輸入影象,輸出目標影象有不同的深度,具體組合如下: 

- 若src.depth() = cv_8u, 取ddepth =-1/cv_16s/cv_32f/cv_64f 

- 若src.depth() = cv_16u/cv_16s, 取ddepth =-1/cv_32f/cv_64f 

- 若src.depth() = cv_32f, 取ddepth =-1/cv_32f/cv_64f 

- 若src.depth() = cv_64f, 取ddepth = -1/cv_64f 

注:ddepth =-1時,代表輸出影象與輸入影象相同的深度。 

int dx:int型別dx,x 方向上的差分階數,1或0 

int dy:int型別dy,y 方向上的差分階數,1或0 

其中,dx=1,dy=0,表示計算x方向的導數,檢測出的是垂直方向上的邊緣;dx=0,dy=1,表示計算y方向的導數,檢測出的是水平方向上的邊緣。 

int ksize:為進行邊緣檢測時的模板大小為ksize*ksize,取值為1、3、5和7,其中預設值為3。

**實現:

int main()

執行結果:

邊緣檢測運算元

看了很多邊緣檢測的文章,有些不夠詳細,有些不算綜合,所以打算總結一下!以下內容均為個人理解,如有問題,望指正!首先,我想要解釋一下什麼是邊緣。通俗地講,灰度值變化劇烈的地方就是邊緣。那麼如何判斷灰度值變化?如何度量 劇烈 各類演算法給出了自己的規範或者說是原則。所以,各類運算元就跳出來了。由於各類運...

邊緣檢測運算元

sobel amp image edgeamplitude filtertype,size 根據影象的一次導數計算影象的邊緣 close edges edges,edgeimage regionresult minamplitude close edges length edges,gradient...

邊緣檢測運算元

1.sobel運算元 索貝爾 主要思想是 利用影象畫素點的上下左右的畫素點進行加權差,邊緣的差值會較大,從而得到對應的邊緣。它是一種差分性運算元,包含3 3的橫向,縱向模板,分別對影象進行卷積,得到橫座標,縱座標的亮度差分值。計算出影象亮度函式的梯度近似值。它是一種基於一階導數的邊緣運算元。優點是能...