神经学和心理学的研究都表明,图像中突变的位置对图像感知很重要。在某种程度上,边缘不随光照和视角的变化而变化。我们使用边缘检测算子找到图像像素值突变的位置,找到图像的边缘。
类比微积分学中用导数描述连续函数的变化,我们使用偏导数描述边缘的检测子,图像函数的变化可以用指向图像函数最大增长方向的梯度来表示。
边缘是一个具有幅值(强度)(magnitude)和方向(direction)的矢量。边缘的幅值是梯度的幅值,边缘方向
Φ
\Phi
Φ是梯度方向
Ψ
\Psi
Ψ旋转
−
9
0
∘
-90^\circ
−90∘的方向,梯度方向是函数增长最大的方向。
梯度算子作为边缘性的度量可以分为三类:
1. 使用差分近似图像函数导数的算子
有些算子具有旋转不变性(例如Laplacian),只需要一个卷积掩膜(即卷积核)来计算。其他近似一阶导数的算子使用几个掩膜。方向在几个简单模式的最佳匹配基础上来估计。
检测小局部邻域的单个梯度算子事实上是卷积,可以用卷积掩膜来表达。能够检测边缘方向的算子是用一组掩膜来表达,每个掩膜对应每个方向。
数字图像本质上是离散的,因此含有导数的公式必须用差分来近似。图像g在纵向(固定i)和横向(固定j)的一阶差分由下式给出
Δ i g ( i , j ) = g ( i , j ) − g ( i − n , j ) \Delta_ig(i,j)=g(i,j)-g(i-n,j) Δig(i,j)=g(i,j)−g(i−n,j) Δ j g ( i , j ) = g ( i , j ) − g ( i , j − n ) \Delta_jg(i,j)=g(i,j)-g(i,j-n) Δjg(i,j)=g(i,j)−g(i,j−n)其中n是小整数,通常取1.数值 n n n的选择既要足够小以便较好地近似导数,又要足够大以便忽略图像函数不重要的变化。
- Roberts算子
Roberts算子是最老的算子之一,它只使用当前像素的 2 × 2 2\times2 2×2邻域,计算非常简单。
它的掩膜是: h 1 = [ 1 0 0 − 1 ] , h 2 = [ 0 1 − 1 0 ] h_1=\left[ \begin{matrix} 1 & 0 \\ 0 & -1 \end{matrix} \right], h_2=\left[ \begin{matrix} 0 & 1\\ -1 & 0 \end{matrix} \right] h1=[100−1],h2=[0−110]因此边缘的幅值计算如下: ∣ g ( i , j ) − g ( i + 1 , j + 1 ) ∣ + ∣ g ( i , j + 1 ) − g ( i + 1 , j ) ∣ \left|g(i,j)-g(i+1,j+1)\right|+\left|g(i,j+1)-g(i+1,j)\right| ∣g(i,j)−g(i+1,j+1)∣+∣g(i,j+1)−g(i+1,j)∣Roberts算子的主要缺点是其对噪声的高度敏感性,原因在于仅使用了很少几个像素来近似梯度。 - Laplace算子
Laplace算子 ∇ 2 \nabla^2 ∇2是近似只给出边缘幅值的二阶导数的流行方法。通常使用 3 × 3 3\times3 3×3的掩膜h,对于4-邻接和8-邻接的邻域分别定义为: h 1 = [ 0 1 0 1 − 4 1 0 1 0 ] , h 2 = [ 1 1 1 1 − 8 1 1 1 1 ] h_1= \left[ \begin{matrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{matrix} \right], h_2= \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & -8 & 1 \\ 1 & 1 & 1 \end{matrix} \right] h1=⎣⎡0101−41010⎦⎤,h2=⎣⎡1111−81111⎦⎤
Laplace算子推导:
一阶差分: f ′ ( x ) = f ( x ) − f ( x − 1 ) f'(x)=f(x)-f(x-1) f′(x)=f(x)−f(x−1)
二阶差分: f ′ ( x ) = ( f ( x + 1 ) − f ( x ) ) − ( f ( x ) − f ( x − 1 ) ) f'(x)=(f(x+1)-f(x))-(f(x)-f(x-1)) f′(x)=(f(x+1)−f(x))−(f(x)−f(x−1))
化简: f ′ ( x ) = f ( x − 1 ) − 2 f ( x ) + f ( x + 1 ) f'(x)=f(x-1)-2f(x)+f(x+1) f′(x)=f(x−1)−2f(x)+f(x+1)
提取系数: [ 1 , − 2 , 1 ] [1,-2,1] [1,−2,1]
二维情况下,同理可得: f ′ ( x , y ) = − 4 f ( x , y ) + f ( x − 1 , y ) + f ( x + 1 , y ) + f ( x , y − 1 ) + f ( x , y + 1 ) f'(x,y)=-4f(x,y)+f(x-1,y)+f(x+1,y)+f(x,y-1)+f(x,y+1) f′(x,y)=−4f(x,y)+f(x−1,y)+f(x+1,y)+f(x,y−1)+f(x,y+1)
提取系数即为 h 1 h_1 h1
考虑两个斜对角的情况即为 h 2 h_2 h2
有时也适用强调中心像素或其邻接性的Laplacian算子,这种近似不再具有旋转不变性: h = [ 2 − 1 2 − 1 − 4 − 1 2 − 1 2 ] , h = [ − 1 2 − 1 2 − 4 2 − 1 2 − 1 ] h= \left[ \begin{matrix} 2 & -1 & 2 \\ -1 & -4 & -1 \\ 2 & -1 & 2 \end{matrix} \right], h= \left[ \begin{matrix} -1 & 2 & -1 \\ 2 & -4 & 2 \\ -1 & 2 & -1 \end{matrix} \right] h=⎣⎡2−12−1−4−12−12⎦⎤,h=⎣⎡−12−12−42−12−1⎦⎤Laplacian算子一般不以其原始形式用于边缘检测,因为其作为一个二阶导数,Laplacian算子对噪声具有无法接受的敏感性;同时它对图像中的某些边缘产生双重响应,这是复杂的分割不希望有的结果;最后Laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面;一般使用的是高斯型拉普拉斯算子(Laplacian of a Gaussian, LoG),由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。 - Prewitt算子
Prewitt算子与Sobel算子、Kirsch算子类似,近似一阶导数。对于 3 × 3 3\times3 3×3的卷积掩膜,在8个可能方向上估计梯度,梯度方向由具有最大响应的掩膜给出,对于其他近似一阶导数的算子也是如此。
用 f ′ ( x ) = f ( x + 1 ) − f ( x − 1 ) f'(x)=f(x+1)-f(x-1) f′(x)=f(x+1)−f(x−1)近似计算一阶差分。
1)排序: [ − 1 ∗ f ( x − 1 ) , 0 ∗ f ( x ) , 1 ∗ f ( x + 1 ) ] [-1*f(x-1),0*f(x),1*f(x+1)] [−1∗f(x−1),0∗f(x),1∗f(x+1)]
2)提出系数: [ − 1 , 0 , 1 ] [-1,0,1] [−1,0,1]
我们给出前三个掩膜,其他的可以通过简单旋转得到: h 1 = [ 1 1 1 0 0 0 − 1 − 1 − 1 ] , h 2 = [ 0 1 1 − 1 0 1 − 1 − 1 0 ] , h 3 = [ − 1 0 1 − 1 0 1 − 1 0 1 ] , . . . h_1= \left[ \begin{matrix} 1 & 1 & 1 \\ 0 & 0 & 0 \\ -1 & -1 & -1 \end{matrix} \right], h_2= \left[ \begin{matrix} 0 & 1 & 1 \\ -1 & 0 & 1 \\ -1 & -1 & 0 \end{matrix} \right], h_3= \left[ \begin{matrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{matrix} \right],... h1=⎣⎡10−110−110−1⎦⎤,h2=⎣⎡0−1−110−1110⎦⎤,h3=⎣⎡−1−1−1000111⎦⎤,...Prewitt算子对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。 - Sobel算子
Sobel由Prewitt算子旋转而来,由掩膜中心点是重点考虑的,它的权重要多一点,因此我们提出以下两种算子:
h 1 = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] , h 3 = [ − 1 0 1 − 2 0 2 − 1 0 1 ] h_1= \left[ \begin{matrix} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{matrix} \right], h_3= \left[ \begin{matrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{matrix} \right] h1=⎣⎡10−120−210−1⎦⎤,h3=⎣⎡−1−2−1000121⎦⎤ Sobel算子是通常用于水平和垂直边缘检测的一个简单检测子,在上面的掩膜中我们使用 h 1 h_1 h1和 h 3 h_3 h3。若 h 1 h_1 h1的响应为 x x x, h 3 h_3 h3的响应为 y y y,那么通过下式可以得到幅值: x 2 + y 2 \sqrt {x^2+y^2} x2+y2或 ∣ x ∣ + ∣ y ∣ \left|x\right|+\left|y\right| ∣x∣+∣y∣方向为 a r c t a n ( y / x ) arctan(y/x) arctan(y/x)。
Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。 - Kirsch算子
h 1 = [ 3 3 3 3 0 3 − 5 − 5 − 5 ] , h 2 = [ 3 3 3 − 5 0 3 − 5 − 5 3 ] , h 3 = [ − 5 3 3 − 5 0 3 − 5 3 3 ] , . . . h_1= \left[ \begin{matrix} 3 & 3 & 3 \\ 3 & 0 & 3 \\ -5 & -5 & -5 \end{matrix} \right], h_2= \left[ \begin{matrix} 3 & 3 & 3 \\ -5 & 0 & 3 \\ -5 & -5 & 3 \end{matrix} \right], h_3= \left[ \begin{matrix} -5 & 3 & 3 \\ -5 & 0 & 3 \\ -5 & 3 & 3 \end{matrix} \right],... h1=⎣⎡33−530−533−5⎦⎤,h2=⎣⎡3−5−530−5333⎦⎤,h3=⎣⎡−5−5−5303333⎦⎤,...
这些边缘检测子的主要缺点是它们依赖物体的大小且对噪声敏感。
算子掩膜都是奇数大小
因为掩膜是偶数的话,卷积出来的结果应该是放在中间的,不方便表示。
例如:图像 [10, 20, 30] 跟 [-1, 1] 卷积后的值,应该放在图像 10 跟 20 中间的位置,就是应该放在 0 和 1 号位置的中间,也就是 0.5 号位,但是图像是离散的,中间没得放,只能放在 0 号位,也就是 10 的位置,就偏差了 0.5 的位置,为了方便处理,滤波掩膜一般都是奇数个的。
2. 基于图像函数二阶导数过零点的算子
例如Marr-Hildreth或Canny边缘检测算法,基于二阶导数过零点的边缘检测技术,探究了阶跃边缘对应图像函数陡峭的变化这一事实。图像函数的一阶导数在对图像边缘的位置上应该取得极值,因此二阶导数在同一位置应该为0;而寻找过零点位置比起极值来的更容易更精确。
- Canny边缘检测算法
Canny的目标是找到一个最优的边缘检测算法,最优性包括三个标准:
1)检测标准:不丢失重要边缘,不应有虚假的边缘;
2)定位标准:实际边缘与检测到的边缘位置之间的偏差最小;
3)单响应标准:图像中给定的边缘应只被标记一次,图像的噪声不应产生假的边缘,将多个响应降低为单个边缘响应。
Canny边缘检测算法的处理流程:
1) 使用高斯滤波器,以平滑图像,滤出噪声;
2D高斯平滑算子 G ( x , y ) G(x,y) G(x,y)由下式给出: G ( x , y ) = e − x 2 + y 2 2 σ 2 G(x,y)=e^{-\frac{x^2+y^2}{2\sigma^2}} G(x,y)=e−2σ2x2+y2
将图像 f f f与算子 G n G_n Gn做卷积, G n G_n Gn是 G G G沿 n \boldsymbol n n方向的一阶方向导数: G n = ∂ G ∂ n = n ∇ G G_n=\frac{\partial G}{\partial \boldsymbol n}=\boldsymbol n\nabla G Gn=∂n∂G=n∇G
希望 n \boldsymbol n n与边缘垂直,边缘位于 G n G_n Gn与图像 f f f卷积在 n \boldsymbol n n方向上的局部最大值位置处 ∂ ∂ n G n ∗ f = 0 \frac{\partial}{\partial \boldsymbol n}G_n*f=0 ∂n∂Gn∗f=0则: ∂ 2 ∂ n 2 G ∗ f = 0 \frac{\partial ^2}{\partial \boldsymbol n ^2}G*f=0 ∂n2∂2G∗f=0上式表明如何在边缘垂直方向上寻找局部最大值,该算子常被称为非极大值抑制。
2) 计算图像中每个像素点的梯度强度和方向;
Canny使用四个算子来检测图像中的水平、垂直和对角边缘,边缘检测算子返回水平 G x G_x Gx和垂直 G y G_y Gy方向的一阶导数值,由此可以确定像素点的梯度 G G G和方向 θ \theta θ。
3) 应用非极大值抑制(NMS),以消除边缘检测带来的杂散响应;
对梯度图像中每个像素进行非极大值抑制的算法为:
i. 将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较;
ii. 如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制;
伪代码为:
4) 应用双阈值检测来确定真实的和潜在的边缘;
伪代码为:
5) 通过抑制鼓励的弱边缘完成边缘检测。
伪代码为:
3. 参数化边缘模型
参数化边缘模型是基于离散图像亮度函数可以看作是对连续或分段连续的图像亮度函数采样的有噪声近似的思想。尽管我们并不知道该函数,但是我们可以根据获得的离散图像亮度函数估计出它,因此图像的性质可以根据这个连续函数来确定。