[OpenCV基礎][Python]邊緣偵測Sobel、Scharr、Laplacian、 Canny

2024/02/06閱讀時間約 5 分鐘

OpenCV 提供了多種用於邊緣偵測的方法,其中一些常見的包括 Sobel、Scharr、Laplacian,還有 Canny 邊緣檢測器。這些方法可以幫助我們檢測圖像中的暗明強度變化,從而找到物體的邊緣

以下方法,都需輸入灰階圖片。


邊緣偵測方法:

Sobel 運算子:

Sobel 運算子用於計算圖像的梯度,尤其是水平方向和垂直方向的梯度。在這個例子中,分別計算了 x 方向 y 方向Sobel 梯度

Sobel 運算子使用 3x3 的核,其中水平和垂直方向的權重分佈如下:

Sobel_X:
[ -1 0 1 ]
[ -2 0 2 ]
[ -1 0 1 ]

Sobel_Y:
[ 1 2 1 ]
[ 0 0 0 ]
[ -1 -2 -1 ]

語法

# Sobel 運算子
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)

cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3): 計算 x 方向的 Sobel 梯度。
cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3): 計算 y 方向的 Sobel 梯度。
ksize 參數指定了 Sobel 核的大小,這裡是 3x3 的核。
cv2.CV_64F 確保了輸出梯度的數據類型是 64 位浮點數。

示範圖

sobel

sobel


Scharr 運算子:

Scharr 運算子也用於計算圖像的梯度,和 Sobel 類似,但其核的權重分佈更均勻,能夠提供更平滑的梯度估計。

水平和垂直方向的權重分佈如下:

Scharr_X:
[ -3 0 3 ]
[ -10 0 10 ]
[ -3 0 3 ]

Scharr_Y:
[ 3 10 3 ]
[ 0 0 0 ]
[ -3 -10 -3 ]

語法

# Scharr 運算子
scharr_x = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharr_y = cv2.Scharr(img, cv2.CV_64F, 0, 1)

img: 輸入的灰度圖像。
cv2.CV_64F: 輸出圖像的深度,通常使用 64 位浮點數以確保梯度的準確性。
10: 分別表示計算 x 方向和 y 方向的梯度。

示範圖

Scharr 與 Sobel X軸的比較

Scharr 與 Sobel X軸的比較

Scharr 與 Sobel Y軸的比較

Scharr 與 Sobel Y軸的比較


Laplacian 運算子

Laplacian 運算子用於計算圖像的二次導數,它可以提取圖像中的輪廓和邊緣信息。這是一種常用的邊緣檢測方法。

語法:

laplacian = cv2.Laplacian(img, cv2.CV_64F, ksize=3)

img: 輸入的灰度圖像。
cv2.CV_64F: 輸出圖像的深度,通常使用 64 位浮點數。
ksize 參數指定了 Laplacian 核的大小,這裡是 3x3 的核。

Laplacian 運算子對圖像中的高頻信息進行了增強,強調了邊緣和細節。

Laplacian

Laplacian


Canny 邊緣檢測器

Canny 邊緣檢測是一種綜合了多個步驟的強大方法,包括高斯模糊計算梯度非極大值抑制雙閾值檢測。它可以在圖像中檢測到細緻的邊緣

語法:

edges = cv2.Canny(img, threshold1, threshold2)

img: 輸入的灰度圖像。
threshold1threshold2: 雙閾值檢測的兩個閾值,用於區分強邊緣、弱邊緣和非邊緣點。

Canny 邊緣檢測在一個連續的操作中完成多個步驟,包括平滑、梯度計算、非極大值抑制和邊緣連接。它能夠產生高質量的邊緣檢測結果,並且可以通過調整閾值進行對結果的細化。

Canny

Canny


邊緣偵測算法的優缺點總結:

Canny 邊緣檢測:

優點:
高準確性: 提供準確的邊緣檢測結果。
低誤報率: 雙閾值檢測可控制強弱邊緣,減少誤報。
平滑效果: 使用高斯平滑有助於去除噪聲

缺點:
複雜度: 實現較複雜,需要調整參數
計算量大: 計算量相對較大。

Sobel 運算子:

優點:
簡單: 實現簡單,易於應用。
適用於清晰圖像: 在清晰圖像中,能有效提取邊緣。

缺點:
對噪聲敏感: 在噪聲多的情況下容易受到干擾。
缺乏方向性: 只提供垂直和水平方向梯度。

Laplacian 運算子:

優點:
提取細節: 能提取圖像中的細節和高頻信息。
無方向性: 不受方向性限制,能檢測多方向邊緣。

缺點:
對噪聲敏感: 容易受到噪聲的干擾。
誤報: 可能產生一些不必要的誤報,特別在有噪聲的圖像中。











49會員
88內容數
Python程式設計師,不是在學習就是在學習的路上
留言0
查看全部
發表第一個留言支持創作者!