OpenCV 提供了多種用於邊緣偵測的方法,其中一些常見的包括 Sobel、Scharr、Laplacian,還有 Canny 邊緣檢測器。這些方法可以幫助我們檢測圖像中的暗明強度變化,從而找到物體的邊緣。
以下方法,都需輸入灰階圖片。
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 位浮點數。
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 位浮點數以確保梯度的準確性。
1
和 0
: 分別表示計算 x 方向和 y 方向的梯度。
Laplacian 運算子用於計算圖像的二次導數,它可以提取圖像中的輪廓和邊緣信息。這是一種常用的邊緣檢測方法。
laplacian = cv2.Laplacian(img, cv2.CV_64F, ksize=3)
img
: 輸入的灰度圖像。
cv2.CV_64F
: 輸出圖像的深度,通常使用 64 位浮點數。
ksize
參數指定了 Laplacian 核的大小,這裡是 3x3 的核。
Laplacian 運算子對圖像中的高頻信息進行了增強,強調了邊緣和細節。
Canny 邊緣檢測是一種綜合了多個步驟的強大方法,包括高斯模糊、計算梯度、非極大值抑制和雙閾值檢測。它可以在圖像中檢測到細緻的邊緣。
edges = cv2.Canny(img, threshold1, threshold2)
img
: 輸入的灰度圖像。
threshold1
和 threshold2
: 雙閾值檢測的兩個閾值,用於區分強邊緣、弱邊緣和非邊緣點。
Canny 邊緣檢測在一個連續的操作中完成多個步驟,包括平滑、梯度計算、非極大值抑制和邊緣連接。它能夠產生高質量的邊緣檢測結果,並且可以通過調整閾值進行對結果的細化。
優點:
高準確性: 提供準確的邊緣檢測結果。
低誤報率: 雙閾值檢測可控制強弱邊緣,減少誤報。
平滑效果: 使用高斯平滑有助於去除噪聲
缺點:
複雜度: 實現較複雜,需要調整參數
計算量大: 計算量相對較大。
優點:
簡單: 實現簡單,易於應用。
適用於清晰圖像: 在清晰圖像中,能有效提取邊緣。
缺點:
對噪聲敏感: 在噪聲多的情況下容易受到干擾。
缺乏方向性: 只提供垂直和水平方向梯度。
優點:
提取細節: 能提取圖像中的細節和高頻信息。
無方向性: 不受方向性限制,能檢測多方向邊緣。
缺點:
對噪聲敏感: 容易受到噪聲的干擾。
誤報: 可能產生一些不必要的誤報,特別在有噪聲的圖像中。