![]() |
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 方向,我们也类似处理。
我们尝试通过添加两个方向梯度来近似梯度(请注意,这根本不是精确计算!但对我们的目的来说已经足够了)。