Introduction

基本步骤:

  • 高斯模糊(Gaussian Smooth):平滑图像,去除噪声(高频信息)
  • 梯度检测(Gradient Detection):得到对应图像每个像素的梯度方向矩阵和梯度强度矩阵
  • 非最大化抑制(Non-Maximum Suppression):
  • 双阈值(Double Threshold):

步骤 Steps

高斯滤波 Gaussian Filtering

首先,生成高斯模板,确定两个参数:

  • scalescale:高斯模板的维度,通常是奇数(2k+12k+1),影响平滑程度
  • σ\sigma:标准差,同样会影响平滑程度

然后根据公式生成模板:
(0)Gaussiani,j=12πσ2eu2+v22σ2 Gaussian_{i,j} = \frac{1}{2\pi\sigma^{2}}e^{\frac{u^{2} + v^{2}}{2\sigma^{2}}} \tag{0}
其中,u=iscale/2u = i-scale/2v=jscale/2v = j - scale/2
归一化(normalization):
(1)Gaussiani,j=Gaussiani,jsum Gaussian_{i,j} = \frac{Gaussian_{i,j}}{sum} \tag{1}
其中,sumsumi,jscaleGaussiani,j\sum_{i,j}^{scale}Gaussian_{i,j}

梯度检测 Gradient Detection

使用边缘检测算子对图像进行卷积,计算出每个像素对应位置的梯度幅值(Gradient)以及梯度方向(Gradient Direction)。
首先,水平方向算子卷积得到 dxi,jdx_{i,j}
(0)sobelx={101202101} sobel_{x}= \left\{ \begin{matrix} & -1 & 0 & 1 & \\ & -2 & 0 & 2 \\ & -1 & 0 & 1 \end{matrix} \right\} \tag{0}
垂直方向算子得到 dyi,jdy_{i,j}
(1)sobely={121000121} sobel_{y}= \left\{ \begin{matrix} & 1 & 2 & 1 & \\ & 0 & 0 & 0 \\ & -1 & -2 & -1 \end{matrix} \right\} \tag{1}
然后,计算梯度幅值:
(2)weighti,j=dxi,j2+dyi,j2 weight_{i,j} = \sqrt{dx_{i,j}^{2} + dy_{i,j}^{2}} \tag{2}
计算梯度方向:
(3)gradienti,j=dxi,jdyi,j gradient_{i,j} = \frac{dx_{i,j}}{dy_{i,j}} \tag{3}
最终得到两个矩阵:

  • 梯度幅值矩阵 WW
  • 梯度方向矩阵 GG

非最大化抑制 Non-Maximum Suppression

判定规则 Rule

确定一个点是否为边缘点,需要确定:这个点的梯度幅值在梯度方向上是不是最大的
通过和梯度正负方向上的两个点的梯度幅值进行比较做出判断:

  • 梯度方向上最大:保留
  • 否则:抑制

确定梯度方向上两点 Determine Neighbours

88 邻域中的像素构成 44 对点,对应 44 个基本梯度方向,如下:
Explain Canny—— 边缘检测算法确定梯度方向上临近两点:

  • 取最靠近梯度方向的基本方向的两个点,例如上图 WWEE
  • 构成梯度方向所在区域的两个基本方向,根据梯度方向(上图 θ\theta )计算出比值进行插值(interpolation),如上图,NENEEE 插值得到 P1P1WWSWSW 得到 P2P2

双阈值 Double Threshold

判断方式如下:

  • if weight>roofif\space weight \gt roof:这个像素是一个边缘像素
  • if weight<floorif\space weight \lt floor:这个像素不属于任何边缘

如果处于高阈值和低阈值的中间的话,那么:

  • 如果 88 领域中含有边缘点的话,那么我们认为这个点也是一个边缘点
  • 如果没有,那么这是一个孤立点,我们不认为这是一个边缘点

    Fin \mathscr{Fin}

相关文章: