OpenCV 4.10.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 方向做类似的操作。
我们尝试通过添加两个方向梯度来近似计算梯度(请注意,这根本不是一个精确的计算,但对于我们的目的而言已经很好了)。