OpenCV 4.11.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* 方向也进行类似的操作。
我们尝试通过添加两个方向梯度来近似梯度(注意,这根本不是精确的计算!但对于我们的目的已经足够了)。