【计算机视觉】Lecture 5:梯度和边缘检测
什么是边缘?
简单的回答:灰度不连续处
物体的边界
不同材料性质的边界
光照的边界
边缘的类型(一维剖面)
边缘可以根据灰度剖面来建模
阶跃边缘 Step edge:图像灰度突然从不连续一侧的一个值变为另一侧的另一个值
斜坡边缘 Ramp edge:灰度变化不是瞬间的而是在有限距离内发生的一种阶跃边缘
例子
边缘的类型(一维剖面)
山脊边缘 Ridge edge:图像灰度值突然变化,然后在很短的距离内回到开始的值;通常由图像中的线产生
例子
边缘的类型(一维剖面)
屋顶边缘:灰度变化不是瞬间的而是在有限距离内发生的一种山脊边缘;通常在曲面相交处产生
例子
阶跃/斜坡边缘术语
边缘描述子
——边缘法向:最大灰度变化方向的单位矢量。
——边缘方向:沿着边缘的单位矢量(垂直于边缘法线)。
——边缘位置/中心:边缘所在图像中的位置
——边缘强度/幅值:沿着边缘法向的局部图像对比度
重点:所有这些信息都可以从梯度向量场计算出来!!
梯度的总结
边缘像素是在梯度幅值局部最大的地方
梯度方向垂直于边缘方向
梯度向量:
梯度幅值:
梯度方向:
使用梯度进行简单的边缘检测
一种简单的梯度幅度边缘检测方法
图像分别和水平导数滤波器以及垂直导数滤波器进行卷积,从而计算每个像素的梯度向量
计算每个像素处的梯度幅值
如果某一像素处的幅值超过一个阈值,则报告可能的边缘点
计算空间图像梯度
使用梯度进行简单的边缘检测
一种简单的梯度幅度边缘检测方法
图像分别和水平导数滤波器以及垂直导数滤波器进行卷积,从而计算每个像素的梯度向量
计算每个像素处的梯度幅值
如果某一像素处的幅值超过一个阈值,则报告可能的边缘点
计算梯度幅值
梯度幅值为
测量每个像素处的坡度陡度(=边缘对比度)
使用梯度进行简单的边缘检测
一种简单的梯度幅度边缘检测方法
图像分别和水平导数滤波器以及垂直导数滤波器进行卷积,从而计算每个像素的梯度向量
计算每个像素处的梯度幅值
如果某一像素处的幅值超过一个阈值,则报告可能的边缘点
查找边缘像素的阈值
使用梯度进行边缘检测
需要解决的问题
我们应该如何选择阈值?
权衡:平滑与定位
在平滑和好的边缘定位之间一直有一个权衡
需要解决的问题
边缘细化和连接
平滑+阈值给我们提供了一个具有“厚”的边缘的二值mask
我们想要薄的,一个像素宽度的,连接的轮廓
Canny边缘检测算子
一个重要的案例研究,可能是CV从业者最常用的边缘检测算法,实验一致表明它的性能非常好
J. Canny, A Computational Approach to Edge Detection, IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol 8, No. 6, Nov 1986
一种最优边缘检测算子的规则化设计
边缘检测包括三步:
- 噪声平滑
- 边缘增强
- 边缘定位
J. Canny将这些步骤规则化,以设计最佳边缘检测算子
边缘模型(一维)
一个理想的边缘可以建模为一个阶跃
加性的白高斯噪声:均方根噪声的幅值/单位长度为
性能标准(1)
好的检测:滤波器在边缘位置(x=0)的响应必须比噪声强
性能标准(2)
好的定位:滤波器在非常接近 x=0 的地方的响应必须是最大值
性能标准(3)
低误报率:在 x=0 的合理邻域中应该只有一个最大值
Canny边缘检测算子
Canny找到了一个线性的连续滤波器,它最大化了这三个给定的标准
最优滤波器没有闭合形式的解
然而,它看起来非常类似于高斯函数的导数
回忆:边缘检测的实际问题
细化和连接
选择一个幅值阈值
Canny对所有这些都有很好的回答
细化
注意:在定阈值之前进行细化
我们想在曲线上标出幅值最大的点
我们可以通过沿着垂直于曲线的一维灰度切片寻找最大值(非最大抑制)来实现这一点
这些点可以形成一个像素宽度的曲线
选择哪个阈值?
问题:
加入阈值太大: 非常少的(或者几乎没有)边缘;错误检测率高,很多间断
加入阈值太小:非常多的(所有像素)边缘;误报率高,很多额外的边缘
解决方法:滞后阈值法
允许我们同时应用两者!(例如,“模糊”阈值)
- 同时保持一个高阈值H和一个低阈值L;
- 任何强度小于L的边缘都将被丢弃;
- 任何强度高于H的边缘都将被保留;
- 只有当有一条强度大于L的边路径将P连接到强度大于H的边时,强度介于L和H之间的边缘P才被保留;
- 在实际应用中,该阈值与边缘连接相结合,得到连接的轮廓
滞后阈值法例子
Canny边缘:例子
精细尺度,高阈值
粗糙尺度,高阈值
粗糙尺度,低阈值
完整的Canny算法
-
计算图像关于x和y的导数:
-
计算每个像素梯度幅值:
-
去掉梯度方向上幅值不是局部最大的像素
-
滞后阈值法
选择幅值M大于高阈值Th的像素点
选择幅值大于低阈值Tl,同时是已经连接的检测出来的边缘点附近的像素点