首頁  >  文章  >  後端開發  >  怎麼使用python進行影像邊緣偵測

怎麼使用python進行影像邊緣偵測

王林
王林轉載
2023-06-03 21:22:011929瀏覽

邊緣偵測

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

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

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

邊緣偵測算子

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

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

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

#1、Roberts算符

怎麼使用python進行影像邊緣偵測

2、Prewitt算符

怎麼使用python進行影像邊緣偵測

3、Sobel算子

Sobel算子偵測到的邊緣比起Roberts算子的偵測結果要連續一些,並且對於影像的細節偵測能力更好,且Sobel邊緣偵測器引入了局部平均,對雜訊的影響比較小,效果較好。

怎麼使用python進行影像邊緣偵測

4、Canny算子

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

  • 用高斯濾波器平滑影像

  • ##用一階偏導的有限差分來計算梯度的幅度和方向

  • 對梯度幅值進行非極大值抑制

  • 用雙閾值演算法偵測和連接邊緣

5、拉普拉斯算子

常見的二階微分算子包括拉普拉斯算子,它是一種二階導師算子,對影像中的雜訊相當敏感,而且檢測出的邊緣常常是雙像素寬,沒有方向信息,所以拉普拉斯算子很少直接用於檢測邊緣,而主要用於已知邊緣像素後,確定此像素是在影像的暗區還是明區。另外,一階差分算子會在較寬範圍內形成較大的梯度值,因此無法準確定位,而利用二階差分算子的過零點可以精確定位邊緣。

Laplace算子的雜訊明顯比Sobel算子的雜訊大,但其邊緣比Sobel要細很多,且Laplace變換作為二階微分算子對雜訊特別敏感,並且會產生雙邊沿,不能偵測邊緣方向。

怎麼使用python進行影像邊緣偵測

效果實驗

#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)

怎麼使用python進行影像邊緣偵測

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)

怎麼使用python進行影像邊緣偵測

3 、Sobel邊緣偵測

Sobel函數:

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

怎麼使用python進行影像邊緣偵測

4、Canny邊緣偵測

##Canny函數:

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

怎麼使用python進行影像邊緣偵測5、Laplacian 邊緣偵測

Laplacian 函數:

edges = cv2.Laplacian(img, -1)

以上是怎麼使用python進行影像邊緣偵測的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除