图像处理中的边缘检测

任务要求:实现10种传统的边缘检测方法,包括Canny算子,Sobel算子,Susan算子,Prewitt算子,Laplace算子,普通梯度方法,LOG算子,Marr算子,Kirsch算子,Roberts算子。最终提交成果为一个完整的软件系统,把个人的代码集成进去演示,然后撰写研究报告。

最近图像理解课开始做大作业了,选题选了整合边缘检测方法,复习的同时做一个简单的笔记。
图像的边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波。对于连续信号,求其微分运算是求信号的变化率,具有加强高频分量的作用,对于离散的图片而言,这个运算就变成了求其差分或梯度。对于一阶差分我们要找的是它的较大值,而对于二阶差分我们要找的是它的零点。

简单的一阶差分

从较为简单的开始嘛,简单一阶差分法对图像没有过多的处理,只是求取梯度数值,比较好理解。以下的一阶差分法都是求取梯度的方法,如果想要得到二值化的边缘图像则需要选取阈值。

正交梯度(普通梯度)

正交梯度法属于一阶差分法,收集的是图片像素点与其上方和左侧的像素点的梯度,公式如下
Gx(m,n)=f(m,n)f(m1,n)Gx(m,n)=f(m,n)-f(m-1,n)Gy(m,n)=f(m,n)f(m,n1)Gy(m,n)=f(m,n)-f(m,n-1)G(m,n)=(Gx2+Gy2)1/2G(m,n)=(Gx^2+Gy^2)^{1/2}核长这样
图像处理中的边缘检测
瞎画的东西长这样
图像处理中的边缘检测
优点:相当简单特别简单不能再简单了
缺点:噪声敏感,效果一般通常不使用

Roberts梯度算子法

Roberts梯度算子算是正交梯度的一个扩展吧,用的是图像和它上、左和上左点组成的四分点进行差分求梯度。公式如下Gx(m,n)=f(m,n)f(m1,n1)Gx(m,n)=f(m,n)-f(m-1,n-1)Gy(m,n)=f(m1,n)f(m,n1)Gy(m,n)=f(m-1,n)-f(m,n-1)G(m,n)=(Gx2+Gy2)1/2G(m,n)=(Gx^2+Gy^2)^{1/2}核长这样
图像处理中的边缘检测
瞎画的东西长这样
图像处理中的边缘检测
优点:相当简单特别简单不能再简单了,比正交梯度用起来好一点
缺点:噪声敏感,效果一般通常不使用

平滑梯度算子法(平均差分法)

到了平均差分法的部分虽然还是在一阶差分进行操作,但是选取了相对简单的差分而言更多的邻域点,对于噪声就有了一定的抑制作用

Prewitt梯度算子法

Prewitt梯度算子法是最为标准的平均差分法,公式有点多就不写了,可以结合核理解,不要忽略核前方的系数。核长下面这样图像处理中的边缘检测
瞎画的东西长这样
图像处理中的边缘检测
优点:计算简单(虽然比之前难一点但是还是很简单),具有一定的噪声抑制能力,在一定情况下可使用。
缺点:不够精细,依赖边缘方向性(改进:方向梯度法)

Sobel梯度算子

Sobel梯度算子又被称为加权平均差分法,其与Prewitt梯度算子的差距在于其更注重于接近选取中心点的像素点,sobel算子是现在很常用的边缘提取方式。其核如下
图像处理中的边缘检测
瞎画的东西长这样
图像处理中的边缘检测

Krisch算子的方向梯度法

在Prewitt算子法中我们说过这种方式较为依赖边缘的方向性,因为Prewitt算子计算了水平和竖直方向的差分,所以其对水平或竖直方向的边缘更为敏感。在方向梯度法中,我们使用多个核进行多方向的差分取其最大值这样就能更好的检测多方向的边缘。
Krisch算子的主核如下,很好理解嗷就是加权平均
图像处理中的边缘检测
结合方向梯度法呢,Krisch算子有八个方向的检测核
图像处理中的边缘检测
瞎画的长这样,最后选取的梯度为292
图像处理中的边缘检测

二阶差分法

Laplacian算子

对于连续二维函数,其二阶导为
图像处理中的边缘检测
我们的图片则是二维离散时间信号,其离散的拉普拉斯变换为2f=4f(m,n)f(m+1,n)f(m1,n)f(m,n+1)f(m,n1)▽^2f=4f(m,n)-f(m+1,n)-f(m-1,n)-f(m,n+1)-f(m,n-1)公式看着是挺乱的,那看看核,核长这样(哇哦太好理解了(p图像处理中的边缘检测
拉普拉斯的核还有其他的变换形式,就不一一列举了。
瞎画的东西,对于边缘地带图像处理中的边缘检测
而对于平滑地带图像处理中的边缘检测
优点:各向同性,线性和唯一不变性,对孤立点及线段的检测效果好。
缺点:对噪声敏感,对噪声有双倍加强作用,不能检测边的方向,常产生双像素边缘(下图为双像素的边缘产生原因)
图像处理中的边缘检测

LOG算子法(Marr-Height算子法)

LOG算子法是基于拉普拉斯算子法的改进,因为拉普拉斯算子法对噪声敏感嘛,所以我们在应用之前进行去噪就可以咯。LOG算子法就是在应用拉普拉斯算子之前进行了高斯平滑。

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 [1] 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

高斯平滑的核函数符合二维高斯分布
图像处理中的边缘检测
其核为(以5*5为例)
图像处理中的边缘检测
在完成高斯平滑后再使用拉普拉斯变换(上部分)
优点:克服了拉普拉斯算子对噪声敏感的特点,减少了噪声影响。

Canny算子

Canny算子拥有较为完备的步骤和良好的结果,其过程如下

  1. 用高斯滤波器平滑图像.
  2. 用一阶偏导有限差分计算梯度幅值和方向.
  3. 对梯度幅值进行非极大值抑制.
  4. 用双阈值算法检测和连接边缘.

高斯滤波在上面的LOG中已经提到过了,其目的在于平滑图像减少噪声对梯度值的影响。
在Canny算子中计算梯度幅值的方法可以从上面的一阶导数法中进行选择,通常我们使用Sobel算子计算图像的一阶导数。

非极大值抑制

在边缘检测和目标检测等领域,非极大值抑制是一种较为常见的算法,其目的在于保留解空间内接近解中的最优值。在我们的边缘检测中是指寻找像素点局部最大值。
例如下图,我们如果要判断c点是否为区域最大值,首先要寻找c点的梯度方向
图像处理中的边缘检测
咋找梯度方向,瞎画的东西如下(Sobel算子),中心点的梯度方向就是与水平方向成 Θ 角的方向。
图像处理中的边缘检测
回到之前的图g1、g2、g3、g4都代表像素点,很明显它们是c的八领域中的4个,左图中c点是我们需要判断的点,蓝色的直线是它的梯度方向,也就是说c要是局部极大值,它的梯度幅值M需要大于直线与g1g2和g2g3的交点,dtmp1和dtmp2处的梯度幅值。可问题在于dtmp1和dtmp2处的两个点并不知道它们的值,这个时候可以采取线性插值的方法。乱画的如下
图像处理中的边缘检测
dtmp1、dtmp2和中心点的值进行比较若不是最大值就进行抑制

双阈值法边缘提取和链接

在一阶差分的开头我就写了

一阶差分法都是求取梯度的方法,如果想要得到二值化的边缘图像则需要选取阈值。

但是选取较低的阈值可以得到较为完整的边缘但是可能会在边缘图中产生噪声引起的伪边缘,选取较高的阈值容易得到去噪的较好的边缘但是边缘经常会不连续,为了解决这些问题,在Canny算子中,我们使用双阈值法进行边缘提取和链接。
首先设定两个阈值,高阈值HT(High threshold)和低阈值LT(Low threshold),将高阈值筛选出的边缘记为强边缘,低阈值筛选出的边缘记为弱边缘,在该方法中我们认定如果弱边缘是真实边缘的情况下,弱边缘应该和强边缘相连接,即探寻一个弱边缘点的邻域,如果包含一个强边缘点则我们认定这是一个真边缘。
利用这种方式我们能较好的结合低阈值和高阈值在边缘提取中的优势从而得到更好的结果图。

FLAG

老师要求了十种但是我没查到Marr算子(好像就是LoG算子),这里一共写了八种,还有一个Susan算子没看明白,明晚补一下。