Edge detection

Canny 边缘检测算子

1. Smoothing:平滑处理(去躁)

  • 处理结果:
    CS131 Lecture 5 Edge detection

  • kernel_size 和标准差 σ 的影响?
    高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真。
    高斯滤波器宽度 (决定着平滑程度) 是由参数 σ 表征的,而且 σ 和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好.通过调节平滑程度参数 σ,可在图像特征过分模糊 (过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量 (欠平滑) 之间取得折衷。
    高斯噪声与高斯滤波

  • 梯度计算前为何要进行平滑滤波?
    平滑是为了去噪,噪声会使得计算梯度时得到幅度较大的异常值。

2.Finding gradients:寻找梯度

  • 计算梯度大小和梯度方向:
    CS131 Lecture 5 Edge detection
  • 处理结果:
    CS131 Lecture 5 Edge detection

3.Non-maximum suppression:非极大值抑制

  • 非极大值抑制属于一种边缘细化的方法,梯度大的位置有可能为边缘,在这些位置沿着梯度方向,找到像素点的局部最大值,并将其非最大值抑制。
    形象的说就是一条粗粗的区域都根据梯度强度判断成了边缘,但目标只需要一条细细的边,这个时候就找区域内的最大的那条作为边(注意是沿着梯度方向),其他的或抛弃或作为备选区域。
  • 具体步骤为:
    a.在 0,45,90,135 四个梯度方向上对 8 - 邻接像素进行判断,
    b.直接比较梯度方向上的相邻的两个像素,
    c.如果当前像素强度是最大,则保留;否则,则抑制它(变为零)。
  • 备注:
    当然这种做法其实是简化版本的,虽然 Canny 的论文上是这么写的,但是后来也有提出,梯度肯定不止这四个,针对别的梯度方向的比较,使用插值等方法来进行非极大值抑制。
  • 参考:
    Canny 算子中的非极大值抑制(Non-Maximum Suppression)分析
  • 处理结果:
    CS131 Lecture 5 Edge detection

4.Double thresholding:双阈值算法

  • 双阀值方法,设置一个 maxval,以及 minval,梯度大于 maxval 则为强边缘,梯度值介于 maxval 与 minval 则为弱边缘点,小于 minval 为抑制点。
    双阈值的结果在第五步可以用来作为边缘追踪的依据。
  • 调参方法:
    如果长直线被断成小段,说明 weak_edges 的阈值太大,weak_edges 的数量较少,此时应当调低 weak_edges 的阈值。
    如果 spurious (伪直线) 出现,说明 strong_edges 的阈值太小,strong_edges 的数量较多,此时应当调高 strong_edges 的阈值。
  • 处理结果:
    CS131 Lecture 5 Edge detection

5.Edge tracking by hysteresis:滞后边缘追踪

  • 由于边缘是连续的,因此可以认为弱边缘如果为真实边缘则和强边缘是联通的,可由此判断其是否为真实边缘。
    将所有可以连接到强边缘的弱边缘都保留,并与强边缘连接起来。
  • 处理结果:
    CS131 Lecture 5 Edge detection

霍夫变换

参考,写得很详细:
霍夫变换直线检测(Line Detection)原理及示例

相关文章: