边缘检测(Edge|边缘检测(Edge Detection)

文章首发:xmoon.info
边缘提取 在大多数时候图像的边缘可以承载大部分的信息,并且提取边缘可以除去很多干扰信息,提高处理数据的效率
目标:
识别图像中的突然变化(不连续)

  • 图像的大部分语义信息和形状信息都可以编码在边缘上
  • 理想:艺术家使用线条勾勒画(但艺术家也使用对象层次的知识)
边缘的种类
  • 表面形状的突变
  • 深度方向的不连续
  • 表面颜色的突变
  • 光线阴影的不连续
边缘的特征
边缘是图像强度函数中快速变化的地方,变化的地方就存在梯度,对灰度值求导,导数为0的点即为边界点
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

卷积的导数
  • 偏导数公式:
? f ( x , y ) ? x = lim ? ε → 0 f ( x + ε , y ) ? f ( x , y ) ε \frac {\partial f(x,y)}{\partial x} = \lim_{\varepsilon \rightarrow 0} \frac{f(x+\varepsilon ,y)-f(x,y)}{\varepsilon} ?x?f(x,y)?=ε→0lim?εf(x+ε,y)?f(x,y)?
  • 在卷积中为描述数据,采取 近似化处理:
    ? f ( x , y ) ? x ≈ f ( x + 1 , y ) ? f ( x , y ) 1 \frac {\partial f(x,y)}{\partial x} \approx \frac{f(x+1,y)-f(x,y)}{1} ?x?f(x,y)?≈1f(x+1,y)?f(x,y)?
显然在x方向的导数就是与该像素自身与右边相邻像素的差值
卷积描述偏导
使用卷积核处理
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

对灰度图的x和y方向分别处理后的效果如下图:
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

有限差分滤波器(卷积核)
  • Roberts 算子
    Roberts 算子是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子。他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。
    1963年, Roberts 提出了这种寻找边缘的算子。 Roberts 边缘算子是一个 2x2 的模版,采用的是对角方向相邻的两个像素之差。
    Roberts 算子的模板分为水平方向和垂直方向,如下所示,从其模板可以看出, Roberts 算子能较好的增强正负 45 度的图像边缘。
d x = [ ? 1 0 0 1 ] dx = \left[ \begin{matrix} -1 & 0\\ 0 & 1 \\ \end{matrix} \right] dx=[?10?01?]
d y = [ 0 ? 1 1 0 ] dy = \left[ \begin{matrix} 0 & -1\\ 1 & 0 \\ \end{matrix} \right] dy=[01??10?]
  • Prewitt算子
    Prewitt 算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用。Prewitt算子适合用来识别噪声较多、灰度渐变的图像。
    d x = [ 1 0 ? 1 1 0 ? 1 1 0 ? 1 ] dx = \left[ \begin{matrix} 1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1\\ \end{matrix} \right] dx=???111?000??1?1?1????
    d y = [ ? 1 ? 1 ? 1 0 0 0 1 1 1 ] dy = \left[ \begin{matrix} -1 & -1 & -1\\ 0 & 0 & 0\\ 1 & 1 & 1\\ \end{matrix} \right] dy=????101??101??101????
  • Sobel算子
    Sobel算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导。Sobel 算子在 Prewitt 算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。
    d x = [ 1 0 ? 1 2 0 ? 2 1 0 ? 1 ] dx = \left[ \begin{matrix} 1 & 0 & -1\\ 2 & 0 & -2\\ 1 & 0 & -1\\ \end{matrix} \right] dx=???121?000??1?2?1????
    d y = [ ? 1 ? 2 ? 1 0 0 0 1 2 1 ] dy = \left[ \begin{matrix} -1 & -2 & -1\\ 0 & 0 & 0\\ 1 & 2 & 1\\ \end{matrix} \right] dy=????101??202??101????
图像梯度
? f = [ ? f ? x , ? f ? y ] \nabla f=[\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}] ?f=[?x?f?,?y?f?]
  • 梯度指向强度增长最快的方向
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

  • 梯度的角度
    边的方向与梯度方向垂直
    θ = t a n ? 1 ( ? f ? y / ? f ? x ) \theta = tan^{-1} (\frac{\partial f}{\partial y}/\frac{\partial f}{\partial x}) θ=tan?1(?y?f?/?x?f?)
  • 梯度的模长(幅值)
    可以说明是边缘的可能性大小
    ∣ ∣ ? f ∣ ∣ = ( ? f ? x ) 2 + ( ? f ? y ) 2 ||\nabla f|| = \sqrt{(\frac{\partial f}{\partial x})^2+(\frac{\partial f}{\partial y})^2} ∣∣?f∣∣=(?x?f?)2+(?y?f?)2 ?
  • 处理图像后:
    边缘检测(Edge|边缘检测(Edge Detection)
    文章图片

高斯滤波器
当图像的像素存在大量噪点时,相邻的像素差异大,所求梯度也会偏大,无法提取边缘信息。
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

解决方案
  1. 平滑处理:使用平滑滤波器去噪,使图像信号变得平滑
  2. 再对处理后的信号求导,取极值
    边缘检测(Edge|边缘检测(Edge Detection)
    文章图片

  3. 根据卷积的计算性质: d d x ( f ? g ) = f ? d d x g \frac{d}{dx}(f*g) = f*\frac{d}{dx}g dxd?(f?g)=f?dxd?g,先对平滑核求导,再进行卷积相乘来简化运算,减少运算量
【边缘检测(Edge|边缘检测(Edge Detection)】边缘检测(Edge|边缘检测(Edge Detection)
文章图片

高斯滤波器
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

高斯滤波器的导数
参数选择的越小则保留的细节越多
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

Candy 边缘检测
门限化
经过处理后,可以得到边缘图,但存在很多高频噪点,通过设置更高的门限,过滤噪点,使得到的边缘更“纯粹”
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

非最大化抑制
在通过高斯滤波后可以得到图像的大致轮廓线,由于图像的像素变换通常是缓慢改变的, 在处理后的图像中仍然存在大量的粗的“边”
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

方案
  1. 检查像素是否沿梯度方向为局部最大值,选择沿边缘宽度的最大值作为边缘
    边缘检测(Edge|边缘检测(Edge Detection)
    文章图片
  2. 处理后
    边缘检测(Edge|边缘检测(Edge Detection)
    文章图片

    经过上面的处理后,已经可以较为粗糙的得到图像的边缘图,但仍然存在问题,在有些部分的边 缘不连续,失去了很多信息如上图的 黄色区域 ,这是由于在门限化的过程中,设置过小,导致将需要的边缘滤除。
双门限法
  1. 先使用高门限将较粗的边检测出来,这些边都是比较鲁棒的,是噪声的可能性极低
  2. 再降低门限,将较细的边显现出来
  3. 将与高门限过滤出的边连接的低门限边保留,滤除没有连接的(不连续的)噪声
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

  1. 处理后可以得到更好的边缘效果
边缘检测(Edge|边缘检测(Edge Detection)
文章图片

学习资源:北京邮电大学计算机视觉——鲁鹏

    推荐阅读