在介绍sobel之前简单说明一下差分的概念。
差分:
与微分对应。差分对应于离散数据,微分对应于连续数据。差分的阶数与微分类
似,一次差分是一阶,差分后再差分就是二阶。
差分可以分为前向差分、后向差分和中心差分。
前向差分:
x k = x o + k h , ( k = 0 , 1 , . . . , n ) Δ f ( x k ) = f ( x k + 1 ) − f ( x k ) x_k=x_o+kh,(k=0,1,...,n)\\ \Delta f\left(x_{k}\right)=f\left(x_{k+1}\right)-f\left(x_{k}\right) xk=xo+kh,(k=0,1,...,n)Δf(xk)=f(xk+1)−f(xk)
后向差分:
Δ f ( x k ) = f ( x k ) − f ( x k − 1 ) \Delta f\left(x_{k}\right)=f\left(x_{k}\right)-f\left(x_{k-1}\right) Δf(xk)=f(xk)−f(xk−1)
中心差分:
Δ f ( x k ) = 1 2 ( f ( x k + 1 ) − f ( x k − 1 ) ) \Delta f\left(x_{k}\right)=\frac{1}{2}\left(f\left(x_{k+1}\right)-f\left(x_{k-1}\right)\right) Δf(xk)=21(f(xk+1)−f(xk−1))
差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具,常用函数差近似导数。
一阶导数的差分表示:
取 x = x k + 1 , x 0 = x k x=x_{k+1}, x_{0}=x_{k} x=xk+1,x0=xk,可得前向差分公式:
f ′ ( x k ) = f ( x k + 1 ) − f ( x k ) x k + 1 − x k f^{\prime}\left(x_{k}\right) = \frac{f\left(x_{k+1}\right)-f\left(x_{k}\right)}{x_{k+1}-x_{k}} f′(xk)=xk+1−xkf(xk+1)−f(xk)
取 x = x k − 1 , x 0 = x k x=x_{k-1}, x_{0}=x_{k} x=xk−1,x0=xk,可得后向差分公式:
f ′ ( x k ) = f ( x k ) − f ( x k − 1 ) x k − x k − 1 f^{\prime}\left(x_{k}\right) = \frac{f\left(x_{k}\right)-f\left(x_{k-1}\right)}{x_{k}-x_{k-1}} f′(xk)=xk−xk−1f(xk)−f(xk−1)
取 x 0 = x k x_0=x_k x0=xk, x x x分别取 x k − 1 , x k + 1 x_{k-1},x_{k+1} xk−1,xk+1并将两式相减,可得中心差分公式:
f ′ ( x k ) = f ( x k + 1 ) − f ( x k − 1 ) x k + 1 − x k − 1 f^{\prime}\left(x_{k}\right)=\frac{f\left(x_{k+1}\right)-f\left(x_{k-1}\right)}{x_{k+1}-x_{k-1}} f′(xk)=xk+1−xk−1f(xk+1)−f(xk−1)
二阶导数的差分表示
取 x 0 = x k , x x_0=x_k,x x0=xk,x分别取 x k − 1 , x k + 1 x_{k-1},x_{k+1} xk−1,xk+1并将两式相加,本质是对差分后的项再求差分,可得中心差分公式:
f ′ ′ ( x k ) = f ( x k + 1 ) + f ( x k − 1 ) − 2 f ( x k ) h 2 f^{\prime \prime}\left(x_{k}\right)=\frac{f\left(x_{k+1}\right)+f\left(x_{k-1}\right)-2 f\left(x_{k}\right)}{h^{2}} f′′(xk)=h2f(xk+1)+f(xk−1)−2f(xk)
Soble 核的作用是充分提取像素附近 x 方向及 y 方向上的差分信息。
假设图像中某个像素 z 5 z_5 z5及其8邻域像素可表示为如图 :
我们要从此邻域中提取四个方向的差分信息,即两个对角 ( z 1 , z 9 ) ( z 3 , z 7 ) (z_1,z_9)(z_3,z_7) (z1,z9)(z3,z7),一个垂直方向 ( z 2 , z 8 ) (z_2,z_8) (z2,z8),一个水平方向 ( z 6 , z 4 ) (z_6,z_4) (z6,z4)。给定四个向量来定义两两像素之间的差分方向,即 [ − 1 , 1 ] , [ 1 , 1 ] , [ 0 , 1 ] , [ 1 , 0 ] [-1,1],[1,1],[0,1],[1,0] [−1,1],[1,1],[0,1],[1,0],它们的具体取值与像素和 z 5 z_5 z5的位置相关,如上图所示,并且这四个向量与上述的四个像素对一一对应。
可以定义梯度矢量如下:
对于 ( z 3 , z 7 ) (z_3,z_7) (z3,z7),他们之间的距离参照曼哈顿距离,为2+2=4,则该像素对的梯度矢量为: ∣ g ( z 1 , z 9 ) ∣ = ( z 1 − z 9 ) [ − 1 , 1 ] 4 \left|g_{\left(z_{1}, z_{9}\right)}\right|=\frac{\left(z_{1}-z_{9}\right)[-1,1]}{4} ∣∣g(z1,z9)∣∣=4(z1−z9)[−1,1],以此类推,四个像素对的所构成的平均梯度矢量和为:
∣ g ∣ = ( ( z 1 − z 9 ) [ − 1 , 1 ] 4 + ( z 3 − z 7 ) [ 1 , 1 ] 4 + ( z 2 − z 8 ) [ 0 , 1 ] 2 + ( z 6 − z 4 ) [ 1 , 0 ] 2 ) 4 = ( [ − z 1 + z 9 + z 3 − z 7 + 2 z 6 − 2 z 4 , z 1 − z 9 + z 3 − z 7 + 2 z 2 − 2 z 8 ] ) 16 \begin{aligned} |g| &=\frac{\left(\frac{\left(z_{1}-z_{9}\right)[-1,1]}{4}+\frac{\left(z_{3}-z_{7}\right)[1,1]}{4}+\frac{\left(z_{2}-z_{8}\right)[0,1]}{2}+\frac{\left(z_{6}-z_{4}\right)[1,0]}{2}\right)}{4} \\ &=\frac{\left(\left[-z_{1}+z_{9}+z_{3}-z_{7}+2 z_{6}-2 z_{4}, z_{1}-z_{9}+z_{3}-z_{7}+2 z_{2}-2 z_{8}\right]\right)}{16} \end{aligned} ∣g∣=4(4(z1−z9)[−1,1]+4(z3−z7)[1,1]+2(z2−z8)[0,1]+2(z6−z4)[1,0])=16([−z1+z9+z3−z7+2z6−2z4,z1−z9+z3−z7+2z2−2z8])
考虑到整数运算速度更快、运算资源占用相对要小,所以,在求梯度矢量和时把分母去掉(相当于
原梯度矢量的值放大16倍),因为我们的最终目的是在图像中进行边缘检测,对所有的像素进行相同的操作对结果没有影响。那么就有:
∣ g ′ ∣ = [ − z 1 + z 9 + z 3 − z 7 + 2 z 6 − 2 z 4 , z 1 − z 9 + z 3 − z 7 + 2 z 2 − 2 z 8 ] = [ − z 1 + z 3 − 2 z 4 + 2 z 6 − z 7 + z 9 , z 1 + 2 z 2 + z 3 − z 7 − 2 z 8 − z 9 ] \begin{aligned} \left|g^{\prime}\right| &=\left[-z_{1}+z_{9}+z_{3}-z_{7}+2 z_{6}-2 z_{4}, z_{1}-z_{9}+z_{3}-z_{7}+2 z_{2}-2 z_{8}\right] \\ &=\left[-z_{1}+z_{3}-2 z_{4}+2 z_{6}-z_{7}+z_{9}, z_{1}+2 z_{2}+z_{3}-z_{7}-2 z_{8}-z_{9}\right] \end{aligned} ∣g′∣=[−z1+z9+z3−z7+2z6−2z4,z1−z9+z3−z7+2z2−2z8]=[−z1+z3−2z4+2z6−z7+z9,z1+2z2+z3−z7−2z8−z9]
可以在此公式中拆分出 x , y x,y x,y方向的梯度,则有:
∣ g ′ ∣ x = − z 1 + z 3 − 2 z 4 + 2 z 6 − z 7 + z 9 ∣ g ′ ∣ y = z 1 + 2 z 2 + z 3 − z 7 − 2 z 8 − z 9 \begin{aligned} \left|g^{\prime}\right|_{x}&=-z_{1}+z_{3}-2 z_{4}+2 z_{6}-z_{7}+z_{9} \\ \left|g^{\prime}\right|_{y}&=z_{1}+2 z_{2}+z_{3}-z_{7}-2 z_{8}-z_{9} \end{aligned} ∣g′∣x∣g′∣y=−z1+z3−2z4+2z6−z7+z9=z1+2z2+z3−z7−2z8−z9
将 ∣ g ′ ∣ x \left|g^{\prime}\right|_{x} ∣g′∣x转换为矩阵的形式以方便做卷积运算,则有:
G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] G_{x}=\left[\begin{array}{lll} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{array}\right] Gx=⎣⎡−1−2−1000121⎦⎤
同理, ∣ g ′ ∣ y \left|g^{\prime}\right|_{y} ∣g′∣y转换为:
G y = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] G_{y}=\left[\begin{array}{ccc} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{array}\right] Gy=⎣⎡10−120−210−1⎦⎤
由此可推导出 G x , G y G_{x},G_{y} Gx,Gy为Sobel滤波器水平方向、垂直方向的算子。 G x , G y G_{x},G_{y} Gx,Gy并不唯一,通过改变差分顺序,可以形成不同的算子。
综上所述,Sobel算子所求得的并不是传统意义上的梯度,而是包含了四个方向像素差分的信息,相比较于只考虑一个方向的差分滤波器,它的边缘检测效果更佳。
Canny 边缘检测是一种非常流行的边缘检测算法,是 John Canny 在 1986 年提出
的。它是一个多阶段的算法,即由多个步骤构成。
1. 图像降噪
我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我们第一步就是想到要先去除噪声,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。使用各种降噪算法把图片中的噪声处理掉(一般使用高斯核,进行低通滤波)。
2.计算图像梯度
使用 sobel 核卷积,计算图像梯度(通过四个方向的差分得到,并不是严格意义上的梯度),得到可能边缘。计算图像梯度能够得到图像的边缘,因为梯度是灰度变化明显的地方,而边缘也是灰度变化明显的地方。当然这一步只能得到可能的边缘。因为灰度变化的地方可能是边缘,也可能不是边缘。这一步就有了所有可能是边缘的集合。如下所示,通过sobel算子差分求得梯度及其方向。
Edge_Gradient ( G ) = G x 2 + G y 2 Angle ( θ ) = tan − 1 ( G y G x ) \begin{array}{c} \text { Edge\_Gradient }(G)=\sqrt{G_{x}^{2}+G_{y}^{2}} \\ \text { Angle }(\theta)=\tan ^{-1}\left(\frac{G_{y}}{G_{x}}\right) \end{array} Edge_Gradient (G)=Gx2+Gy2 Angle (θ)=tan−1(GxGy)
3.非极大值抑制
第三步,非极大值抑制。通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。即“胖边缘”变成“瘦边缘”。具体如图所示
g 1 , g 2 , g 3 , g 4 , C g_{1}, g_{2}, g_{3}, g_{4}, C g1,g2,g3,g4,C都为像素点,在 g 1 , g 2 , g 3 , g 4 g_{1}, g_{2}, g_{3}, g_{4} g1,g2,g3,g4点上进行线性插值,并判断交点 d T m p 1 dTmp_1 dTmp1, d T m p 2 dTmp_2 dTmp2与 C C C的大小关系,从而判断 C C C是否为极大值, 若为极大值留下,否则取 0。这么做可以让边缘的线变细。
4.双阈值筛选
通过非极大值抑制后,仍然有很多的假的边缘点,进一步的设置一个双阈值,即低阈值,高阈值。灰度变化大于高阈值的,设置为强边缘像素,低于低阈值的,剔除。在低阈值和高阈值之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。
这样做的目的是只保留强边缘轮廓的话,有些边缘可能不闭合,需要从满足低阈值和高阈值之间的点进行补充,使得边缘尽可能的闭合。还有一种方法是对于弱边缘像素,逐次判断该像素邻域上的点周围是否有强边缘点,有的话保存,没有剔除,迭代到没有没有弱边缘点为止。
Reference
https://www.zhihu.com/question/30416914
https://baike.baidu.com/item/%E5%B7%AE%E5%88%86/10349967?fr=aladdin
https://www.zhihu.com/question/266037140
https://blog.csdn.net/saltriver/article/details/80545571