边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。
一阶: Roberts Cross算子,Prewitt算子,Sobel算子, Kirsch算子,罗盘算子;
二阶: Marr-Hildreth,在梯度方向的二阶导数过零点,Canny算子,Laplacian算子。
边缘其实就是图像上灰度级变化很快的点的集合。这些点往往梯度很大。图像的梯度可以用一阶导数和二阶偏导数来求解。但是图像以矩阵的形式存储的,不能像数学理论中对直线或者曲线求导一样,对一幅图像的求导相当于对一个平面、曲面求导。对图像的操作,我们采用模板对原图像进行卷积运算,从而达到我们想要的效果。而获取一幅图像的梯度就转化为:模板(Roberts、Prewitt、Sobel、Lapacian算子)对原图像进行卷积。
2. 经典边缘检测算子的简介
Roberts算子
Roberts算子,又称罗伯茨算子,是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子。他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。
Roberts算子是对图像的对角方向的边缘感兴趣的梯度算子,是一种最简单的算子,利用局部差分算子寻找边缘。它采用对角线方向相邻两像素之差近似梯度幅值检测边缘。
下面分别用python自带的函数和自己按照Roberts算法编的代码,采用的方法是在原图像的第一行和第一列填充0,然后对其进行卷积计算,采用的公式为:
Prewitt算子
Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。
通常用 f '(x) = f(x + 1) - f(x - 1) 近似计算一阶差分。可以提出系数:[-1, 0, 1],这个就是模板。在二维情况下是:
-1, 0, 1
-1, 0, 1
-1, 0, 1
这个就是prewitt算子。即
f(x-1, y-1), f(x, y-1), f(x+1, y-1)
f(x-1, y), f(x, y), f(x+1, y)
f(x-1, y+1), f(x, y+1), f(x+1, y+1)
Sobel算子
Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。
sobel算子的原理,对传进来的图像像素做卷积,卷积的实质是在求梯度值,或者说给了一个加权平均,其中权值就是所谓的卷积核;然后对生成的新像素灰度值做阈值运算,以此来确定边缘信息。
卷积核和算法实现原理:
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:
具体计算如下:
图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:
通常,为了提高效率使用不开平方的近似值:
然后可用以下公式计算梯度方向:
若图像为:
则使用近似公式的计算的结果为:
另外,卷积核也可以旋转,用与查找不与x,y轴平行或垂直的方向上的边缘。
Krisch算子
Kirsch边缘算子由八个方向的卷积核构成,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算中取最大值作为图像的边缘输出:
Canny算子
Canny边缘检测算法的流程如下:
之所以把Canny算子归为一阶算子,我想是因为在计算梯度值和方向的过程中使用的是一阶检测算子的原因。
罗盘算子
罗盘算子性能超过Canny算子,相比其他算子,它以像素颜色分布代替均值,利用EMD距离找到罗盘直径方向,该方向的直径能最大化圆形窗口中被直径分隔开的两半区域的差异,此方向即为边缘方向,两半圆区域之间的差异度即为边缘幅值,两者构成向量,类似于梯度。
Laplacian边缘检测
拉普拉斯算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度(▽f)的散度(▽·f)。拉普拉斯算子也是最简单的各向同性微分算子,具有旋转不变性,即将原图像旋转后进行滤波处理给出的结果与先对图像滤波然后再旋转的结果相同。一个二维图像的拉普拉斯算子定义为:
因为任意阶微分都是线性操作,所以拉普拉斯变换也是一个线性算子。为了以离散形式描述这一公式,在x方向将公式描述成:
同理,在y方向将公式描述成:
遵循这三个公式,两个变量的离散拉普拉斯算子为:
Laplacian常用的算子模板:
4邻域:
8邻域:
Log边缘检测
拉普拉斯边缘检测算子没有对图像做平滑处理,所以对噪声很敏感。因此可以想到先对图像进行高斯平滑处理,然后再与Laplacian算子进行卷积。这就是高斯拉普拉斯算子(laplacian of gaussian)。
下式中G为标准差为σ \sigmaσ(有时σ \sigmaσ也称为空间常数)的二维高斯函数(省略了常数)
为求∇ 2 G \nabla ^{2}G∇2G的表达式,执行如下微分:
整理各项后给出如下最终表达式:
该式成为高斯拉普拉斯(LoG)
Log边缘检测流程:
LoG常用的卷积模板是(在实践中,会用该模板的负模板):
DoG边缘检测
考虑到灰度变化取决于数值范围的事实,有时所用的过程是使用各种σ \sigmaσ值来对一幅图像进行滤波。然后,所得零交叉边缘图与仅为全部图形保留的公共边缘相结合。这种方法可得到很有用的信息,但由于其复杂性,实践中它多被用做使用单一滤波器选择合适的σ \sigmaσ值的设计工具。
Marr and Hildreth[1980]指出过,使用高斯差分(DoG)来近似LoG滤波器是可能的:
其中σ 1 > σ 2 \sigma1>\sigma2σ1>σ2。实验结果表明,在人的视觉系统中,某些“通道”就方向和频率而论是有选择性的,且可以使用1.75:1的标准差比率来建模。Marr和Hildreth建议过,使用16:1的比率不仅可保持这些观察的基本特性,而且还可对LoG函数提供一个更接近的“工程”近似。为在LoG和DoG之间进行有意义的比较,对于LoG,σ \sigmaσ值必须按照以下公式选择,以便LoG和DoG具有相同的零交叉:
当使用这个σ \sigmaσ值时,尽管LoG和DoG的零交叉相同,但它们的幅度大小会不同。可以通过标定这两个函数使得它们兼容,以便它们在原点处有相同的值。