OpenCV—边缘检测
1 什么是边缘?
边缘是图像强度函数快速变化的地方
2 如何检测边缘?
为了检测边缘,我们需要检测图像中的不连续性,可以使用导数来检测不连续性。
3 算法理论介绍与推荐
3.1 Sobel算子
我们可以使用3×33 \times 33×3 的卷积核来进行图像求导:
$$
{\displaystyle \mathbf {G}’{y}={ \begin{bmatrix}+1&+2&+1\0&0&0\-1&-2&-1\end{bmatrix}}*\mathbf {I} \quad {\mbox{和}}\quad \mathbf{G}’{x}={\begin{bmatrix}+1&0&-1\+2&0&-2\+1&0&-1\end{bmatrix}}*\mathbf {I} }
其中$ \mathbf {I}表示原图片,表示原图片,表示原图片,\mathbf {G}’{x}和和和\mathbf {G}’{y}分别表示沿图片水平和竖直方向上的变化,分别表示沿图片水平和竖直方向上的变化,分别表示沿图片水平和竖直方向上的变化, * $表示卷积操作
【例1】下面以Sobel算子为例讲述如何计算梯度
x和y方向的Sobel算子分别为:
Hij=12πσ2exp(−(i−(k+1))2+(j−(k+1))22σ2);1≤i,j≤(2k+1) {\displaystyle H_{ij}={\frac {1}{2\pi \sigma ^{2}}}\exp \left(-{\frac {(i-(k+1))^{2}+(j-(k+1))^{2}}{2\sigma ^{2}}}\right);1\leq i,j\leq (2k+1)} Hij=2πσ21exp(−2σ2(i−(k+1))2+(j−(k+1))2);1≤i,j≤(2k+1)
若图像G\mathbf {G}G中一个3x3的窗口为A,要计算梯度的像素点为e,则和Sobel算子进行卷积之后,像素点e在x和y方向的梯度值分别为:
\begin{equation}\begin{aligned}{G}’{x}=G{x} * A=\left[\begin{array}{ccc}-1 & 0 & 1 \-2 & 0 & 2 \-1 & 0 & 1\end{array}\right] *\left[\begin{array}{ccc}a & b & c \d & e & f \g & h & i\end{array}\right]=\operatorname{sum}\left(\left[\begin{array}{ccc}-a & 0 & c \-2 d & 0 & 2 f \-g & 0 & i\end{array}\right]\right) \{G}’{y}=G{y} * A=\left[\begin{array}{ccc}1 & 2 & 1 \0 & 0 & 0 \-1 & -2 & -1\end{array}\right] *\left[\begin{array}{ccc}a & b & c \d & e &