首頁 > 軟體

python進行影象邊緣檢測的詳細教學

2023-04-02 06:01:40

邊緣檢測

影象邊緣是指影象中表達物體的周圍畫素灰度發生階躍變化的那些畫素集合。

影象中兩個灰度不同的相鄰區域的交界處,必然存在灰度的快速過渡或稱為跳變,它們與影象中各區域邊緣的位置相對應,邊緣蘊含了豐富的內在資訊,如方向、階躍性質、形狀等,沿邊緣走向的畫素變化平緩,而垂直於邊緣方向的畫素變化劇烈。

影象的大部分資訊都集中在邊緣部分,邊緣確定後實際上就實現了不同區域的分割。

邊緣檢測運算元

求取邊緣往往要藉助一些邊緣檢測運算元,這些運算元有的是基於一階導數的運算元,有的是二階微分運算元

Roberts運算元、Prewitt運算元、Sobel運算元它們包含x、y兩個方向的模板,每種模板只對相應的方向敏感,對該方向上的方向有明顯的輸出,而對其他方向的變化響應不大。以下是一些常見的一階微分運算元及其特點:

運算元名稱特點
簡單微分運算元對噪聲敏感,對噪聲具有一定放大作用
Roberts運算元去噪聲作用小,邊緣檢測能力優於簡單微分運算元
Prewitt運算元能夠有效抑制噪聲的影響,同時能夠檢測邊緣點
Sobel運算元得到的邊緣較寬,噪聲抑制效果更強
Canny運算元檢測的邊緣位置準確且邊緣較窄

1、Roberts運算元

2、Prewitt運算元

3、Sobel運算元

Sobel運算元檢測到的邊緣相比於Roberts運算元的檢測結果要連續一些,並且對於影象的細節檢測能力更好,且Sobel邊緣檢測器引入了區域性平均,對噪聲的影響比較小,效果較好。

4、Canny運算元

Canny得到的檢測結果優於Roberts、Sobel運算元的檢測結果,邊緣細節更豐富,邊緣定位準確連續性較好,虛假邊緣少且邊緣均具有單畫素寬度。
其演演算法實現具體分為以下4步:

  • 用高斯濾波器平滑影象
  • 用一階偏導的有限差分來計算梯度的幅度和方向
  • 對梯度幅值進行非極大值抑制
  • 用雙閾值演演算法檢測和連線邊緣

5、拉普拉斯運算元

常見的二階微分運算元包括拉普拉斯運算元,它是一種二階導師運算元,對影象中的噪聲相當敏感,而且檢測出的邊緣常常是雙畫素寬,沒有方向資訊,所以拉普拉斯運算元很少直接用於檢測邊緣,而主要用於已知邊緣畫素後,確定該畫素是在影象的暗區還是明區。另外,一階差分運算元會在較寬範圍內形成較大的梯度值,因此不能準確定位,而利用二階差分運算元的過零點可以精確定位邊緣。
Laplace運算元的噪宣告顯比Sobel運算元的噪聲大,但其邊緣比Sobel要細很多,且Laplace變換作為二階微分運算元對噪聲特別敏感,並且會產生雙邊沿,不能檢測邊緣方向。

效果實驗

1、 Roberts邊緣檢測

Prewitt 運算元程式碼:

Roberts_kernel_x = np.array([[-1, 0], [0, 1]], dtype=int)
Roberts_kernel_y = np.array([[0, -1], [1, 0]], dtype=int)

2、Prewitt 邊緣檢測

Prewitt 運算元程式碼:

Roberts_kernel_x = np.array([[-1, 0], [0, 1]], dtype=int)
Roberts_kernel_y = np.array([[0, -1], [1, 0]], dtype=int)

3、Sobel邊緣檢測

Sobel函數:

edges = cv2.Sobel(img, -1, 1, 1)

4、Canny邊緣檢測

Canny函數:

edges = cv2.Canny(img, 5, 100)

5、Laplacian 邊緣檢測

Laplacian 函數:

edges = cv2.Laplacian(img, -1)

總結 

到此這篇關於python進行影象邊緣檢測的文章就介紹到這了,更多相關python影象邊緣檢測內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com