Sobel 導數



目標

轉載:https://blog.csdn.net/xw20084898/article/details/22101673

本文檔嘗試解答如下問題:

 瞭解圖像邊緣原理 sobel提取邊緣原理準備知識  圖像可以理解成  z=f(x,y) z便是灰度值

原理

Note

 

以下內容來自於Bradski和Kaehler的大作: Learning OpenCV .

  1. 上面兩節我們已經學習了卷積操作。一個最重要的卷積運算就是導數的計算(或者近似計算).

  2. 爲什麼對圖像進行求導是重要的呢? 假設我們需要檢測圖像中的 邊緣 ,如下圖:

    How intensity changes in an edge

    你可以看到在 邊緣 ,相素值顯著的 改變 了。表示這一 改變 的一個方法是使用 導數 。 梯度值的大變預示着圖像中內容的顯著變化。

  3. 用更加形象的圖像來解釋,假設我們有一張一維圖形。下圖中灰度值的”躍升”表示邊緣的存在:

    Intensity Plot for an edge
  4. 使用一階微分求導我們可以更加清晰的看到邊緣”躍升”的存在(這裏顯示爲高峯值)

    First derivative of Intensity - Plot for an edge
  5. 從上例中我們可以推論檢測邊緣可以通過定位梯度值大於鄰域的相素的方法找到(或者推廣到大於一個閥值).

  6. 更加詳細的解釋,請參考Bradski 和 Kaehler的 Learning OpenCV 。

Sobel算子

  1. Sobel 算子是一個離散微分算子 (discrete differentiation operator)。 它用來計算圖像灰度函數的近似梯度。
  2. Sobel 算子結合了高斯平滑和微分求導。

計算

假設被作用圖像爲 I:

  1. 在兩個方向求導:

    1. 水平變化: 將 I 與一個奇數大小的內核 G_{x} 進行卷積。比如,當內核大小爲3時, G_{x} 的計算結果爲:

      G_{x} = \begin{bmatrix}-1 & 0 & +1  \\-2 & 0 & +2  \\-1 & 0 & +1\end{bmatrix} * I

    2. 垂直變化: 將:math:I 與一個奇數大小的內核 G_{y} 進行卷積。比如,當內核大小爲3時, G_{y} 的計算結果爲:

      G_{y} = \begin{bmatrix}-1 & -2 & -1  \\0 & 0 & 0  \\+1 & +2 & +1\end{bmatrix} * I

  2. 在圖像的每一點,結合以上兩個結果求出近似 梯度:

    G = \sqrt{ G_{x}^{2} + G_{y}^{2} }

    有時也用下面更簡單公式代替:

    G = |G_{x}| + |G_{y}|

Note

當內核大小爲 3 時, 以上Sobel內核可能產生比較明顯的誤差(畢竟,Sobel算子只是求取了導數的近似值)。 爲解決這一問題,OpenCV提供了Scharr 函數,但該函數僅作用於大小爲3的內核。該函數的運算與Sobel函數一樣快,但結果卻更加精確,其內核爲:

G_{x} = \begin{bmatrix}-3 & 0 & +3  \\-10 & 0 & +10  \\-3 & 0 & +3\end{bmatrix}G_{y} = \begin{bmatrix}-3 & -10 & -3  \\0 & 0 & 0  \\+3 & +10 & +3\end{bmatrix}

關於( Scharr )的更多信息請參考OpenCV文檔。在下面的示例代碼中,你會發現在 Sobel 函數調用的上面有被註釋掉的 Scharr 函數調用。 反註釋Scharr調用 (當然也要相應的註釋掉Sobel調用),看看該函數是如何工作的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章