CS131 Lecture 5 Edge detection
Edge detection
Canny 边缘检测算子
1. Smoothing:平滑处理(去躁)
-
处理结果:
-
kernel_size 和标准差 σ 的影响?
高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真。
高斯滤波器宽度 (决定着平滑程度) 是由参数 σ 表征的,而且 σ 和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好.通过调节平滑程度参数 σ,可在图像特征过分模糊 (过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量 (欠平滑) 之间取得折衷。
高斯噪声与高斯滤波 -
梯度计算前为何要进行平滑滤波?
平滑是为了去噪,噪声会使得计算梯度时得到幅度较大的异常值。
2.Finding gradients:寻找梯度
- 计算梯度大小和梯度方向:
- 处理结果:
3.Non-maximum suppression:非极大值抑制
- 非极大值抑制属于一种边缘细化的方法,梯度大的位置有可能为边缘,在这些位置沿着梯度方向,找到像素点的局部最大值,并将其非最大值抑制。
形象的说就是一条粗粗的区域都根据梯度强度判断成了边缘,但目标只需要一条细细的边,这个时候就找区域内的最大的那条作为边(注意是沿着梯度方向),其他的或抛弃或作为备选区域。 - 具体步骤为:
a.在 0,45,90,135 四个梯度方向上对 8 - 邻接像素进行判断,
b.直接比较梯度方向上的相邻的两个像素,
c.如果当前像素强度是最大,则保留;否则,则抑制它(变为零)。 - 备注:
当然这种做法其实是简化版本的,虽然 Canny 的论文上是这么写的,但是后来也有提出,梯度肯定不止这四个,针对别的梯度方向的比较,使用插值等方法来进行非极大值抑制。 - 参考:
Canny 算子中的非极大值抑制(Non-Maximum Suppression)分析 - 处理结果:
4.Double thresholding:双阈值算法
- 双阀值方法,设置一个 maxval,以及 minval,梯度大于 maxval 则为强边缘,梯度值介于 maxval 与 minval 则为弱边缘点,小于 minval 为抑制点。
双阈值的结果在第五步可以用来作为边缘追踪的依据。 - 调参方法:
如果长直线被断成小段,说明 weak_edges 的阈值太大,weak_edges 的数量较少,此时应当调低 weak_edges 的阈值。
如果 spurious (伪直线) 出现,说明 strong_edges 的阈值太小,strong_edges 的数量较多,此时应当调高 strong_edges 的阈值。 - 处理结果:
5.Edge tracking by hysteresis:滞后边缘追踪
- 由于边缘是连续的,因此可以认为弱边缘如果为真实边缘则和强边缘是联通的,可由此判断其是否为真实边缘。
将所有可以连接到强边缘的弱边缘都保留,并与强边缘连接起来。 - 处理结果:
霍夫变换
参考,写得很详细:
霍夫变换直线检测(Line Detection)原理及示例