边缘特征
- 一阶导的max可表示边缘
- 二阶导的abs的max可表示边缘
- 一阶导产生较粗的边缘
- 二阶导对精细细节、孤立点、噪声较为敏感
- 二阶导在灰度斜坡处会产生双边缘
- 二阶导max的正负,可区分边缘是由亮到暗,或是由暗到亮。
边缘检测
- 滤波:消除噪声
- 增强:增强轮廓
- 检测:选出边缘点
相关算子
Laplacian
- 各向同性
- 对噪声敏感
- 可能会出现双像素边界,常用来判断边缘像素位于图像的明区或暗区,很少用于边缘检测
Laplacian-Gauss(LOG)
将Laplacian和Gaussian结合起来,克服Laplacian对噪声敏感的问题。
Roberts算子
对角线算子,定位较为精确,但对噪声敏感。
prewitt算子
Roberts算子的改进,抑制了噪声,但是低通特性造成定位不如Roberts算子。
Sobel算子
Sobel算子又是Prewitt算子的改进。引入了权重,抑制噪声和精确定位都有提升。
canny边缘检测
JohnCanny于1986年提出Canny算子,它和Marr(LoG)边缘检测方法类似,属于先平滑后求导数的方法。
- 滤波
- 增强
- 检测
灰度化
Canny算子处理灰度图,因此如果处理彩色图像,需要进行进行灰度化。灰度化是对各个通道进行加权平均。以RGB格式的彩图为例,通常灰度化采用的方法主要有:
Gray=(R+G+B)/3
Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点)
高斯滤波
虽然滤波会导致边缘模糊,但滤波会减少噪声的影响,高斯滤波是二者的折衷方案。
梯度计算
一阶偏导有限差分可以近似计算梯度的幅值和方向。Canny算子采用的算子如下:
x,y方向的偏导数,梯度幅值、梯度方向可计算如下:
方向导数范围是[90,-90),正数可以表示沿着x,y正方向像素增加或者减少;负数表示沿着x的正方形或者y的负方向像素增加或者减少。
由一阶导算子可以看出向右是x正方向,向上是y的正方向。
非极大值抑制
梯度求出后,如何确定出边缘的梯度,或者如何根据梯度确定边缘,Canny算子采用非极大值抑制的方法(标准)。
非极大值抑制简单说就是询问这样一个问题:当前梯度是否是它的梯度方向上的局部(8邻域即可)最大值,是的话设当前位置像素为128,否则为0(本质上非极大值抑制是寻找局部最大值的过程)
我们知道8邻域内,梯度方向的邻域像素有可能是亚像素,需要插值。简化的方法是将梯度方向离散化为0、45、90、135度四种可能,可不必插值,但效果不是最优(注意梯度的方向只能确定递增或递减的方向,不能进一步确定。因此方向取4个不是8个,因为取的是前后两点)
插值的原理是:
dTemp1 = weightg1 + (1-weight)g2;
dTemp2 = weightg3 + (1-weight)g4;
weight = ctan( abs(gx) / abs(gy) )
仔细看,它就是一个按边长分配的加权。例如dTmp1,它离g2的权重就是distance(dTmp1, g2) / distance(g1, g2)。
双阈值检测
非极大值抑制的结果是一个二值图,表示可能为边缘的位置,还存在较多的噪声造成的假边缘,最终用双阈值法检测出轮廓。
大于高阈值的像素成为强边界,高阈值用于将边缘和背景区分开,但结果通常不是连续的。
低阈值在上述结果上,将处于高低阈值之间的若边界提取出来,方法是在强边界的端点处,在8邻域内寻找弱边界,找到的弱边界作为强边界,重复上述过程,直到闭合。
可以看到计算量巨大,像是BFS/DFS一样,还没有明显的剪枝条件。