边缘检测

边缘特征

  • 一阶导的max可表示边缘
  • 二阶导的abs的max可表示边缘
image.png

image.png

image.png
  • 一阶导产生较粗的边缘
  • 二阶导对精细细节、孤立点、噪声较为敏感
  • 二阶导在灰度斜坡处会产生双边缘
  • 二阶导max的正负,可区分边缘是由亮到暗,或是由暗到亮。

边缘检测

  • 滤波:消除噪声
  • 增强:增强轮廓
  • 检测:选出边缘点

相关算子

Laplacian

  • 各向同性
  • 对噪声敏感
  • 可能会出现双像素边界,常用来判断边缘像素位于图像的明区或暗区,很少用于边缘检测
Laplacian.png

Laplacian-Gauss(LOG)

将Laplacian和Gaussian结合起来,克服Laplacian对噪声敏感的问题。

Roberts算子

对角线算子,定位较为精确,但对噪声敏感。

image.png

prewitt算子

Roberts算子的改进,抑制了噪声,但是低通特性造成定位不如Roberts算子。

image.png

Sobel算子

Sobel算子又是Prewitt算子的改进。引入了权重,抑制噪声和精确定位都有提升。

image.png

canny边缘检测

JohnCanny于1986年提出Canny算子,它和Marr(LoG)边缘检测方法类似,属于先平滑后求导数的方法。

  • 滤波
  • 增强
  • 检测

灰度化

Canny算子处理灰度图,因此如果处理彩色图像,需要进行进行灰度化。灰度化是对各个通道进行加权平均。以RGB格式的彩图为例,通常灰度化采用的方法主要有:

Gray=(R+G+B)/3

Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点)

高斯滤波

虽然滤波会导致边缘模糊,但滤波会减少噪声的影响,高斯滤波是二者的折衷方案。

梯度计算

一阶偏导有限差分可以近似计算梯度的幅值和方向。Canny算子采用的算子如下:

image

x,y方向的偏导数,梯度幅值、梯度方向可计算如下:

image

方向导数范围是[90,-90),正数可以表示沿着x,y正方向像素增加或者减少;负数表示沿着x的正方形或者y的负方向像素增加或者减少。

由一阶导算子可以看出向右是x正方向,向上是y的正方向。

非极大值抑制

梯度求出后,如何确定出边缘的梯度,或者如何根据梯度确定边缘,Canny算子采用非极大值抑制的方法(标准)。

非极大值抑制简单说就是询问这样一个问题:当前梯度是否是它的梯度方向上的局部(8邻域即可)最大值,是的话设当前位置像素为128,否则为0(本质上非极大值抑制是寻找局部最大值的过程)

我们知道8邻域内,梯度方向的邻域像素有可能是亚像素,需要插值。简化的方法是将梯度方向离散化为0、45、90、135度四种可能,可不必插值,但效果不是最优(注意梯度的方向只能确定递增或递减的方向,不能进一步确定。因此方向取4个不是8个,因为取的是前后两点)

image

插值的原理是:

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一样,还没有明显的剪枝条件。

你可能感兴趣的:(边缘检测)