Edge detection(边缘检测)
目录
目标: 识别图像中的 突然变化(不连续) 的图像
(一)边缘特征
1.边缘种类
(1)表面法线不连续
(2)深度不连续
(3)表面颜色不连续
(4)光照不连续
2.导数(Derivative)
(1)边缘作为图像中快速变化的点,可以通过求导来提取边缘
导数公式
公式可近似为
(2)该点的导数等于右边的点减自身,可以用卷积来实现这个过程
左下图是对x求导,右下图是对y求导。
对x求导,可以提取左右差距比较明显的边缘
对y求导,可以提取上下差距比较明显的边缘
3.其他边缘提取方法
(1)prewitt:采用的是[-1 0 1],并且是左边和右边各取3个像素来判断该点是不是边缘
提取的更准确,对噪声的敏感程度更低
(2)sobel:可以分解成[1 2 1]的转置×[-1 0 1]。
[1 2 1]的转置是一个高斯滤波操作,[-1 0 1]是一个边缘提取操作,即先对图像做了平滑操作再对图像边缘进行提取
对噪声的敏感程度更低一些
(3)**roberts:**衡量的是斜对角的差异值,Mx检测的是135度方向的边,My检测的是45度方向的边。
(二)梯度(Gradient)
1.定义
梯度指向强度增加最快的方向
梯度方向与边垂直,通过梯度的方向大致可以知道边的方向
2.计算
梯度值越强,表明该点越有可能是边
(三)噪声
1.噪声的影响
噪声导致很多点的变化比较大,这时求导的结果就会很不准确,根本无法准确提取边缘
由于误差导致的结果如图:
2.高斯偏导函数
用高斯偏导滤波器去噪
两次卷积操作:fg(去噪)和d(fg)/dx(边缘提取)
由于卷积非常耗时间,我们可以将两次卷积操作用一次完成
高斯偏导模板不可分离
高斯偏导(平滑化的导数)可以去除噪音,但会模糊边缘。
还可以找到不同 "尺度 "的边缘,越大越模糊。
3.高斯偏导函数vs高斯平滑函数
(1)高斯平滑过滤器
目标是平滑,去除 "高频 "成分。
高斯平滑滤波器的值不为负数,总和为1
(2)高斯偏导滤波器
目标是提取边缘信息
高斯偏导滤波器的值会是负数,总和为0,平坦的区域才没有响应值
值越高,跟周围差异越大,可能是边或噪声
(四)Canny边缘检测器算法
如何利用Canny来对下图进行边缘提取呢?
1.实现步骤
(1)通过高斯核进行滤波,去除噪声点,使图像平滑
(2)通过求取偏导,使用梯度强度和方向来提取边缘轮廓
(3)采用非极大值抑制的方法,将提取到的粗犷的边缘轮廓细化
(4)采用双阈值来进一步过滤噪声即过滤掉不想要的线条,同时保证轮廓的连续性
1.计算梯度
计算梯度强度和方向
该点梯度越小越小有可能是噪声产生的,因此将低于门限的点认为是是噪声。
2.非极大化抑制(Non-maximum suppression)
由于图像的像素是逐渐进行过渡的,因此我们通过上述过程提取到的边缘会很粗,我们想要得到的图像的边缘应该只有一个像素的粗细。因此我们要提取突变最大的地方作为图像的边缘。
非极大值抑制法,即沿梯度方向,选取梯度强度最大的一个像素块进行保留,将其余像素块舍弃的方法。
比较方法通常为:沿梯度方向,取一像素点,和该像素点前后各一像素的像素点,进行比较,保留最大值。
非最大化抑制后的结果:
3.双阈值滤波(Hysteresis thresholding)
在对图像去噪时有一些边也被抹掉了,如何让这些边在去噪时不被去除?
采用双阈值滤波法
双阈值滤波是基于如下的假设进行的:
假设所有噪声所产生的线条与图像的轮廓是不发生连接的。
这样,我们就可以设置两个阈值,一个高阈值,一个低阈值。高阈值用来保留轮廓线,低阈值用来过滤噪声和突变不明显的线条。
在低阈值和高阈值之间,且和轮廓线相邻的线条可保留,否则舍弃。采用的思想是判断强边周围是否存在弱边,即通过强边延伸弱边
判断弱边周围是否存在强边,来进而确定该弱边是否是我们所需要的边,是否进行滤除。该方法的缺陷:
强边为H,其上有一点a与弱边相连。该弱边为L,其上有一点b和一点c,b点和a点相连。
如果,在判断弱边是否滤除的时候,先判断b点,后判断c点,得知b点和a点相连,b点设为1值保留,c点和b点相连,因此c点也设为1值保留
如果,先判断c点,后判断b点,那么得出的结论是:c点周围没有1值,丢弃。这将导致我们丢失掉我们想要的点