边缘检测之从Sobel、Canny、DoG到XDoG

笔者按:2012年发表的XDoG这篇文章在图像处理领域个人认为是一片非常经典的文章。本文里面不仅提出了XDoG,还对传统的图像边缘检测理论、DoG理论做出了详细的阐释,并给出了XDoG的多个应用。本文就记录一下在读这篇文章中的一些重点和思考。

先给出自己的实验结果

(第一张图是用彩色RGB图像测试的,第二张是灰度图

话不多说,开始看文章

1、引言

略过

2、背景

本章从边缘检测的历史发展入手,从传统的Sobel讲到DoG。先看看一些常用的边缘检测算子:

2.1 基于梯度的边缘检测

比较经典的就是Prewitt和Sobel,它们用一个小卷积核卷积整个图像,然后如果阈值超过某个限定值则认定为边缘。因为这个卷积核通常很小,所以它们对高频噪声也很明显。解决方法就是在检测前先用低通滤波(如:gaussian blur)过滤一下。

Canny对此进行了一些改进。将blur和求梯度的操作进行了一个合成,并使用非极大值抑制来检测局部极大值从而定位边缘。但是,canny检测器定位到的边缘是一个点(或者宽度为1的线),这在NPR(艺术化渲染)领域是很难接受的。

2.2 基于拉普拉斯算子的边缘检测

Marr 和 Hildreth建议通过识别二阶导数的零点来定位边缘检测器的结果——二阶导数的零点就可以定位到梯度(一阶导数)的极大值点,也就是边缘的位置。

但是问题在于,虽然在上图中的一维信号情况下的关系很简单,但是推广到二维信号上就比较复杂了:我们要计算某个方向的二阶导数。但是这个方向是不确定的——总不能计算所有方向的二阶导数吧?于是伟大的科学家们提出用拉普拉斯算子来解决这个问题:

但痛苦的是,Laplace算子对噪声也很敏感。也需要在使用前用高斯平滑器给图像过一遍。高斯模糊是一个高斯核对图像的卷积操作,而拉普拉斯操作对卷积满足交换律,于是有

嗨呀,这不就是大名鼎鼎的高斯拉普拉斯(Laplacian of Gaussian, LoG)算子吗!

需要注意的是,用这个算子提取边缘的时候,通常会同时检测周围的邻域(为了验证二阶导数的零点)。由于这个验证过程,导致LoG算子实际上的输出也是一个点(宽度为1的线)。虽然同样在艺术上很丑,但是它在后面的DoG、XDoG等中扮演着很重要的角色。

2.3 高斯差分算子DoG

LoG算子的问题在于它在计算上是不可分离的(x,y方向上),所以算起来很慢。为了解决这个问题,提出了DoG算子。用DoG算子近似LoG算子的依据是:

 所以,两种算子的关系如下:

两个算子仅仅只在系数上有差别。而且这个系数还有一点好处:它赋予了DoG算子尺度归一化的特性:修改尺度σ的时候算子的响应不会变化。

通常在工程中,k=1.6是一个效果不错的值。

另外,文中还给出了一种从信号处理角度看DoG算子的解释:

即,两个高斯算子相减,相当于一个带通滤波器,过滤掉高频(噪点),低频(平坦的部分),那么剩下的就是边缘了。

2.4 延展高斯差分算子XDoG

所谓extand...怎么解释呢...

我们从thresholded DoG讲起

比如说我们想生成一张半色调(黑白两色)的边缘图像,我们要么从一张黑色图像开始,让边缘变白,要么反之;而DoG作为一个带通滤波器,它的输出其实描述了原图像中的频率在一个范围内的部分。那么我们可以将输出定义为DoG响应的阈值函数:

其中u代表DoG算子的输出,而ε则用于控制对噪声的敏感度。这个算子在一维信号上的解释如图:

接下来,通过引入一个τ,来控制截止频率较高的那个高斯滤波器的强度:

以及,对阈值函数的进一步修正(通过引入tanh函数)

把上面两个式子结合起来,就诞生了本文所说的XDoG啦,是不是很简单!

但是尽管这个式子直观又简单,但实际应用的时候效果很难控制。τ,φ,ε三个参数的一点改变都可能导致输出图像的巨大变化。通过将上面的式子分解我们可以一窥究竟:

也就是说,这个新的DoG算子等价于一个模糊图像(第二项)和一个标准DoG算子(第一项)的和!更进一步深究的话,标准 DoG 的平均响应为零,而模糊图像将具有与输入图像相同的平均亮度。因此,这个新算子的输出的平均亮度将随着τ的增大而变小。但是,为了增加对边缘的敏感程度,我们又要增加τ,这就导致——我们在修改τ的时候,都要对φ和ε进行对应的补偿调整。

2.5 XDoG的重参数化

从上面的分析也看出来了,如果要用XDoG的话,这个参数是很难调的,一方面是可能一点点的参数改变就会导致出来的效果差距很大,另外一点就是对于不同的图像,参数的鲁棒性不好,可能换一张图片就需要换一组参数。

所以,对XDoG的重参数化,目标有以下几个:(1)对几个参数解耦合;(2)通过将XDoG分解为更加直观的图像处理步骤,如,模糊或者锐化,来获得更加直观的参数;此外,作者还提出了一个”可逆性“,就是指新的参数组可以和上面的参数组互相转换。

观察方程6,其实可以将方程两边同时除以(τ-1)来实现以上目的,即

用方程(7)代替方程(6),并和方程(5)可以组成一个新的响应系统。这个响应系统的值域和原来的系统显然是相同的。在新的系统中p控制边缘锐化效果的强度,而不会影响其它的方面;ε则控制输出图像的强度(intensity)

据作者说,由式子7生成的锐化图像可以对应摄影技术中的一个技术——unsharp mask:这个技术指的是,摄影师在洗片子的时候,有时会复制一个负片的模糊版本,而在打印照片的时候,用这个模糊的负片作为蒙版,可以起到锐化原图像中的边缘的效果。对应到上面的式子,模糊的负片就对应着第二项。下图很好地说明了方程(7)的作用过程

在大部分情况下,方程(7)和(5)结合就可以生成不错的艺术效果了,但是其实也可以用其他的一些方法代替方程(5)以实现更进一步的效果:

参数选择:ε通常接近于灰度值的中间值,p≈20。φ的范围则更大,它控制着S曲线的斜率,φ较小的时候,图像中的值对亮度变化很敏感,而φ越大,斜率则会变小,参数对小的变化也变得不那么敏感了。

2.6 FDoG

上述的XDoG是一个各向同性的处理,在有噪声的图中可能会导致很多不连续的小边缘。虽然可以通过降低p来避免这种情况,但是这样做也会影响到强边缘的输出。可以通过SST(结构张量)或者ETF(edge tangent flow/field)来解决这个问题。

这一部分具体而言就是通过一个ETF来引导XDoG图像,不再赘述了。具体怎样引导可以参见《Coherent Line Drawing》这篇文章,这篇文章讲了一个比较简单的用ETF引导图像的方法。

3~4 章

介绍了几种艺术化效果的实现和一些参数的讨论,这里就不再赘述了,有兴趣的可以自行读一下这部分。最后放一些文中给的效果图和自己尝试的效果图

 结语

XDoG看起来效果还是很好的,但原理非常简单。问题在于这个方法的参数很复杂,文中附录给出了几个样张的参数,可以看出,样张之间的参数变化都非常大。如何在这其中找到一个合适的平衡还是很难的。

(不好意思,公司原因,代码就不放了)

猜你喜欢

转载自blog.csdn.net/q274488181/article/details/121858539