图像处理——Canny边缘检测及sobel介绍

Sobel算子介绍

在介绍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(xk1)
中心差分:
Δ 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(xk1))
差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具,常用函数差近似导数。
一阶导数的差分表示:
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+1xkf(xk+1)f(xk)
x = x k − 1 , x 0 = x k x=x_{k-1}, x_{0}=x_{k} x=xk1,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)=xkxk1f(xk)f(xk1)
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} xk1,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+1xk1f(xk+1)f(xk1)
二阶导数的差分表示
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} xk1,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(xk1)2f(xk)

Sobel 核

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(z1z9)[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(z1z9)[1,1]+4(z3z7)[1,1]+2(z2z8)[0,1]+2(z6z4)[1,0])=16([z1+z9+z3z7+2z62z4,z1z9+z3z7+2z22z8])
考虑到整数运算速度更快、运算资源占用相对要小,所以,在求梯度矢量和时把分母去掉(相当于
原梯度矢量的值放大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+z3z7+2z62z4,z1z9+z3z7+2z22z8]=[z1+z32z4+2z6z7+z9,z1+2z2+z3z72z8z9]
可以在此公式中拆分出 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} gxgy=z1+z32z4+2z6z7+z9=z1+2z2+z3z72z8z9
∣ g ′ ∣ x \left|g^{\prime}\right|_{x} gx转换为矩阵的形式以方便做卷积运算,则有:
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=121000121
同理, ∣ g ′ ∣ y \left|g^{\prime}\right|_{y} gy转换为:
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=101202101
由此可推导出 G x , G y G_{x},G_{y} Gx,Gy为Sobel滤波器水平方向、垂直方向的算子。 G x , G y G_{x},G_{y} Gx,Gy并不唯一,通过改变差分顺序,可以形成不同的算子。
综上所述,Sobel算子所求得的并不是传统意义上的梯度,而是包含了四个方向像素差分的信息,相比较于只考虑一个方向的差分滤波器,它的边缘检测效果更佳。

Canny边缘检测

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 (θ)=tan1(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值