OpenCV sobel() 函式

Manav Narula 2023年1月30日
  1. 在 Python 中使用 Sobel() 函式進行邊緣檢測
  2. まとめ
OpenCV sobel() 函式

使用 OpenCV 庫,我們可以對影象進行處理和應用各種技術。這些過程構成了複雜的計算機視覺任務的一個組成部分,其中一項任務是影象中的邊緣檢測。

邊緣是影象中物件的邊界或輪廓,與畫素密度的非常大的變化相關聯。通過比較相鄰畫素的密度,我們可以檢測邊緣。

各種演算法可用於邊緣檢測並應用於 OpenCV 庫。一種這樣的技術是 Sobel 邊緣檢測演算法。

本教程將演示在 Python 中使用 OpenCV 的 Sobel 演算法。

在 Python 中使用 Sobel() 函式進行邊緣檢測

Sobel 邊緣檢測演算法使用影象梯度來預測和查詢影象中的邊緣。我們使用該演算法比較畫素密度以檢測邊緣。

我們計算函式的一階導數以找到峰值點。然後將它們與閾值進行比較。

在這種技術中,Sobel 運算元計算函式的梯度。它結合了高斯平滑和微分。

通常,我們使用核心來平滑或模糊影象,但在這種情況下,我們將使用它們來計算梯度。沿 x 和 y 軸計算導數。

使用這兩個值計算給定點的梯度。該梯度值不易產生噪聲,然後用於邊緣檢測。

OpenCV 庫使用 Sobel() 函式來實現這一點。我們需要指定帶有幾個引數的函式以及影象。

我們需要提及最終影象的深度,由 ddepth 引數指定。值為 -1 時,輸出影象將與輸入影象具有相同的深度。

使用 dxdy 引數指定要使用的導數的順序。使用 ksize 引數提及擴充套件 Sobel 核心的大小。

scaledelta 引數是可選的。現在讓我們看一個例子。

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出:

沿 X 和 Y 軸使用 Sobel 進行邊緣檢測

在上面的例子中,我們使用了 Sobel() 函式。我們計算了沿 x 和 y 軸的一階導數並獲得了梯度,然後將其用於查詢輪廓。

最終影象為 64 位,如 ddepth 引數中所指定。使用的核心大小為 5x5。

注意 GaussianBlur() 函式;它用於模糊給定影象,Sobel 運算元在模糊影象上效果最好。waitKey()destroyAllWindows() 函式阻止輸出視窗關閉並等待使用者按下某個鍵退出。

如前所述,我們在上例中計算了沿 x 軸和 y 軸的導數。我們還可以通過將另一個軸的導數設為 0 來計算沿任一軸的導數。

例如,

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出:

沿 X 軸使用 Sobel 進行邊緣檢測

在上面的程式碼中,我們只計算沿水平方向的導數,並將 dy 引數的值設定為 0。要計算垂直方向的導數,我們將 dx 引數設定為 0。

請注意,在我們的示例中,我們使用的核心大小為 5x5。我們也可以使用 3x3 大小,但在這種情況下結果包含許多不準確之處,不推薦使用。

Scharr 過濾器是另一個類似於 Sobel 的運算元,可用於 3x3 的情況。

まとめ

本教程演示瞭如何使用 OpenCV 庫中的 Sobel() 函式。我們首先從瞭解用於邊緣檢測的 Sobel 演算法開始。

我們瞭解了影象梯度的基礎知識以及 Sobel 運算元如何有效地計算它。文章中演示了不同情況的示例。

還討論了使用 3x3 核心的缺點,在這種情況下,可以使用其替代方案 Scharr 濾波器來提供更好的結果。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相關文章 - Python OpenCV

相關文章 - OpenCV Image