![]() |
OpenCV 4.12.0
開源計算機視覺
|
| 原始作者 | Ana Huamán |
| 相容性 | OpenCV >= 3.0 |
在本教程中,您將學習如何
您可以很容易地注意到,在邊緣處,畫素強度會顯著變化。表達變化的好方法是使用導數。梯度的高變化表示影像中的重大變化。
假設待操作影像為 \(I\)
我們計算兩個導數
\[G_{x} = \begin{bmatrix} -1 & 0 & +1 \\ -2 & 0 & +2 \\ -1 & 0 & +1 \end{bmatrix} * I\]
\[G_{y} = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ +1 & +2 & +1 \end{bmatrix} * I\]
在影像的每個點,我們透過結合上述兩個結果來計算該點梯度的近似值
\[G = \sqrt{ G_{x}^{2} + G_{y}^{2} }\]
儘管有時會使用以下更簡單的方程
\[G = |G_{x}| + |G_{y}|\]
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}\]
我們計算 x 和 y 方向的“導數”。為此,我們使用 Sobel() 函式,如下所示:該函式接受以下引數:
請注意,為了計算 x 方向的梯度,我們使用:\(x_{order}= 1\) 和 \(y_{order} = 0\)。對於 y 方向,我們也類似處理。
我們嘗試透過新增兩個方向梯度來近似梯度(請注意,這根本不是精確計算!但對我們的目的來說已經足夠了)。