深度学习传统CV算法——二阶微分边缘算子

article/2025/7/17 11:30:12

二阶微分边缘算子

  • 二阶微分边缘算子
    • 二阶微分边缘算子基本思想
    • Laplace 算子
      • 拉普拉斯表达式
      • 图像中的Laplace 算子
      • Laplace算法过程
      • Laplace算子的旋转不变性证明
      • Laplace算子优缺点
    • LOG算子
      • LoG解决的问题
      • LoG算子的计算过程
      • LoG的卷积模板
      • LoG算法过程
      • DoG与LoG
      • LoG算子优缺点
    • Canny算子
      • Canny算子概述
      • Canny算子检测步骤
      • Canny算子各步骤详解
        • 彩色图像转换为灰度图像
        • 对图像进行高斯模糊
        • 计算图像梯度,根据梯度计算图像边缘幅值与角度
        • 非极大值抑制(边缘细化)
        • 双阈值检测
        • 通过抑制孤立的弱边缘完成边缘检测
        • 二值化图像输出结果
      • Canny算子优缺点

二阶微分边缘算子

二阶微分边缘算子基本思想

  • 边缘即是图像的一阶导数局部最大值的地方,那么也意味着该点的二阶导数为零。

  • 二阶微分边缘检测算子就是利用图像在边缘处的阶跃性导致图像二阶微分在边缘处出现零值这一特性进行边缘检测的。

对于图像的二阶微分可以用拉普拉斯算子来表示:
∇ 2 I = ∂ 2 I ∂ x 2 + ∂ 2 I ∂ y 2 \nabla^{2} I=\frac{\partial^{2} I}{\partial x^{2}}+\frac{\partial^{2} I}{\partial y^{2}} 2I=x22I+y22I
我们在像素点(i,j)的3×3 的邻域内,可以有如下的近似:
∂ 2 I ∂ x 2 = I ( i , j + 1 ) − 2 I ( i , j ) + I ( i , j − 1 ) \frac{\partial^{2} I}{\partial x^{2}}=I(i, j+1)-2 I(i, j)+I(i, j-1) x22I=I(i,j+1)2I(i,j)+I(i,j1)
∂ 2 I ∂ y 2 = I ( i + 1 , j ) − 2 I ( i , j ) + I ( i − 1 , j ) \frac{\partial^{2} I}{\partial y^{2}}=I(i+1, j)-2 I(i, j)+I(i-1, j) y22I=I(i+1,j)2I(i,j)+I(i1,j)
∇ 2 I = − 4 I ( i , j ) + I ( i , j + 1 ) + I ( i , j − 1 ) + I ( i + 1 , j ) + I ( i − 1 , j ) \nabla^{2} I=-4 I(i, j)+I(i, j+1)+I(i, j-1)+I(i+1, j)+I(i-1, j) 2I=4I(i,j)+I(i,j+1)+I(i,j1)+I(i+1,j)+I(i1,j)

对应的二阶微分卷积核为 :
m = [ 0 1 0 1 4 1 0 1 0 ] \boldsymbol{m}=\left[\begin{array}{lll}0 & 1 & 0 \\ 1 & 4 & 1 \\ 0 & 1 & 0\end{array}\right] m=010141010

所以二阶微分检测边缘的方法就分两步:

  1. 用上面的 Laplace 核与图像进行卷积;
  2. 对卷积后的图像,取得那些卷积结果为0 的点。

Laplace 算子

拉普拉斯表达式

Laplace (拉普拉斯)算子是最简单的各向同性微分算子,一个二维图像函数的拉普拉斯变换是各向同性的二阶导数。下式为 Laplace 算子的表达式:
∇ 2 f ( x , y ) = ∂ 2 f ( x , y ) ∂ x 2 + ∂ 2 f ( x , y ) ∂ y 2 \nabla^{2} f(x, y)=\frac{\partial^{2} f(x, y)}{\partial x^{2}}+\frac{\partial^{2} f(x, y)}{\partial y^{2}} 2f(x,y)=x22f(x,y)+y22f(x,y)
我们知道梯度的表达式为: ∇ = ∂ ∂ x i ⃗ + ∂ ∂ y j ⃗ \nabla=\frac{\partial}{\partial x} \vec{i}+\frac{\partial}{\partial y} \vec{j} =xi +yj
于是上式的推导过程就是:
∇ 2 ≜ ∇ ⋅ ∇ = ( ∂ ∂ x i ⃗ + ∂ ∂ y j ⃗ ) ⋅ ( ∂ ∂ x i ⃗ + ∂ ∂ y j ⃗ ) = ∂ 2 ∂ x 2 + ∂ 2 ∂ y 2 \nabla^{2} \triangleq \nabla \cdot \nabla=\left(\frac{\partial}{\partial x} \vec{i}+\frac{\partial}{\partial y} \vec{j}\right) \cdot\left(\frac{\partial}{\partial x} \vec{i}+\frac{\partial}{\partial y} \vec{j}\right)=\frac{\partial^{2}}{\partial x^{2}}+\frac{\partial^{2}}{\partial y^{2}} 2=(xi +yj )(xi +yj )=x22+y22

图像中的Laplace 算子

考虑到图像是离散的二维矩阵,用差分近似微分可以得到:
∂ 2 f ∂ x 2 = ∂ G ∂ x = ∂ [ f ( i , j ) − f ( i , j − 1 ) ] ∂ x = ∂ f ( i , j ) ∂ x − ∂ f ( i , j − 1 ) ∂ x \frac{\partial^{2} f}{\partial x^{2}}=\frac{\partial G}{\partial x}=\frac{\partial[\mathrm{f}(\mathrm{i}, \mathrm{j})-\mathrm{f}(\mathrm{i}, \mathrm{j}-1)]}{\partial x}=\frac{\partial \mathrm{f}(\mathrm{i}, \mathrm{j})}{\partial x}-\frac{\partial \mathrm{f}(\mathrm{i}, \mathrm{j}-1)}{\partial x} x22f=xG=x[f(i,j)f(i,j1)]=xf(i,j)xf(i,j1)
= [ f ( i , j + 1 ) − f ( i , j ) ] − [ f ( i , j ) − f ( i , j − 1 ) ] =[\mathrm{f}(\mathrm{i}, \mathrm{j}+1)-\mathrm{f}(\mathrm{i}, \mathrm{j})]-[\mathrm{f}(\mathrm{i}, \mathrm{j})-\mathrm{f}(\mathrm{i}, \mathrm{j}-1)] =[f(i,j+1)f(i,j)][f(i,j)f(i,j1)]
= f ( i , j + 1 ) − 2 f ( i , j ) + f ( i , j − 1 ) =\mathrm{f}(\mathrm{i}, \mathrm{j}+1)-2 \mathrm{f}(\mathrm{i}, \mathrm{j})+\mathrm{f}(\mathrm{i}, \mathrm{j}-1) =f(i,j+1)2f(i,j)+f(i,j1)
同理,可得:
∂ f 2 ∂ x 2 = f ( i + 1 , j ) − 2 f ( i , j ) + f ( i − 1 , j ) \frac{\partial_{f}^{2}}{\partial x^{2}}=\mathrm{f}(\mathrm{i}+1, \mathrm{j})-2 \mathrm{f}(\mathrm{i}, \mathrm{j})+\mathrm{f}(\mathrm{i}-1, \mathrm{j}) x2f2=f(i+1,j)2f(i,j)+f(i1,j)
于是有:
∇ 2 f = ∂ f 2 ∂ x 2 + ∂ f 2 ∂ x 2 = f ( i + 1 , j ) + f ( i − 1 , j ) + f ( i , j + 1 ) + f ( i , j − 1 ) − 4 f ( i , j ) \nabla^{2} \mathrm{f}=\frac{\partial_{f}^{2}}{\partial x^{2}}+\frac{\partial_{f}^{2}}{\partial x^{2}}=\mathrm{f}(\mathrm{i}+1, \mathrm{j})+\mathrm{f}(\mathrm{i}-1, \mathrm{j})+\mathrm{f}(\mathrm{i}, \mathrm{j}+1)+\mathrm{f }(\mathrm{i}, \mathrm{j}-1)-4 \mathrm{f}(\mathrm{i}, \mathrm{j}) 2f=x2f2+x2f2=f(i+1,j)+f(i1,j)+f(i,j+1)+f(i,j1)4f(i,j)
用模板来表示为:
[ 0 1 0 1 − 4 1 0 1 0 ] \left[\begin{array}{ccc}0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0\end{array}\right] 010141010
还有一种常用的卷积模板为:
[ − 1 − 1 − 1 − 1 8 − 1 − 1 − 1 − 1 ] \left[\begin{array}{ccc}-1 & -1 & -1\\ -1 & 8 & -1 \\ -1 & -1 & -1\end{array}\right] 111181111
有时我们为了在邻域中心位置取到更大的权值,还使用如下卷积模板:
[ 1 4 1 4 − 20 4 1 4 1 ] \left[\begin{array}{ccc}1 & 4 & 1 \\ 4 & -20 & 4 \\ 1 & 4 & 1\end{array}\right] 1414204141

Laplace算法过程

(1)遍历图像(除去边缘,防止越界),对每个像素做Laplancian模板卷积运算
(2)复制到目标图像,结束。

Laplace算子的旋转不变性证明

∇ 2 f = ∂ 2 f ∂ x ′ 2 + ∂ 2 f ∂ y ′ 2 = ∂ ∂ x ′ ( ∂ f ∂ x ′ ) + ∂ ∂ y ′ ( ∂ f ∂ y ′ ) = ∂ ∂ x ′ ( ∂ f ∂ x ∂ x ∂ x ′ + ∂ f ∂ y ∂ y ∂ x ′ ) + ∂ ∂ y ′ ( ∂ f ∂ x ∂ x ∂ y ′ + ∂ f ∂ y ∂ y ∂ y ′ ) = ∂ ∂ x ′ ( ∂ f ∂ x cos ⁡ θ + ∂ f ∂ y sin ⁡ θ ) + ∂ ∂ y ′ ( − sin ⁡ θ ∂ f ∂ x + cos ⁡ ∂ f ∂ y ) = ∂ ∂ x ( ∂ f ∂ x cos ⁡ θ + ∂ f ∂ y sin ⁡ θ ) ∂ x ∂ x ′ + ∂ ∂ y ( ∂ f ∂ x cos ⁡ θ + ∂ f ∂ y sin ⁡ θ ) ∂ y ∂ x ′ + ∂ ∂ x ( − sin ⁡ θ ∂ f ∂ x + cos ⁡ ∂ f ∂ y ) ∂ x ∂ y ′ + ∂ ∂ y ( − sin ⁡ θ ∂ f ∂ x + cos ⁡ ∂ f ∂ y ) ∂ y ∂ y ′ = ∂ ∂ x ( ∂ f ∂ x cos ⁡ θ + ∂ f ∂ y sin ⁡ θ ) cos ⁡ θ + ∂ ∂ y ( ∂ f ∂ x cos ⁡ θ + ∂ f ∂ y sin ⁡ θ ) sin ⁡ θ + ∂ ∂ x ( − sin ⁡ θ ∂ f ∂ x + cos ⁡ ∂ f ∂ y ) ( − sin ⁡ θ ) + ∂ ∂ y ( − sin ⁡ θ ∂ f ∂ x + cos ⁡ θ ∂ f ∂ y ) cos ⁡ θ = ∂ ∂ x ∂ f ∂ x + ∂ ∂ y ∂ f ∂ y = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \begin{aligned} \nabla^{2} f &=\frac{\partial^{2} f}{\partial x^{\prime 2}}+\frac{\partial^{2} f}{\partial y^{\prime 2}} \\ &=\frac{\partial}{\partial x^{\prime}}\left(\frac{\partial f}{\partial x^{\prime}}\right)+\frac{\partial}{\partial y^{\prime}}\left(\frac{\partial f}{\partial y^{\prime}}\right) \\ &=\frac{\partial}{\partial x^{\prime}}\left(\frac{\partial f}{\partial x} \frac{\partial x}{\partial x^{\prime}}+\frac{\partial f}{\partial y} \frac{\partial y}{\partial x^{\prime}}\right)+\frac{\partial}{\partial y^{\prime}}\left(\frac{\partial f}{\partial x} \frac{\partial x}{\partial y^{\prime}}+\frac{\partial f}{\partial y} \frac{\partial y}{\partial y^{\prime}}\right) \\ &=\frac{\partial}{\partial x^{\prime}}\left(\frac{\partial f}{\partial x} \cos \theta+\frac{\partial f}{\partial y} \sin \theta\right)+\frac{\partial}{\partial y^{\prime}}\left(-\sin \theta \frac{\partial f}{\partial x}+\cos \frac{\partial f}{\partial y}\right) \\ &=\frac{\partial}{\partial x}\left(\frac{\partial f}{\partial x} \cos \theta+\frac{\partial f}{\partial y} \sin \theta\right) \frac{\partial x}{\partial x^{\prime}}+\frac{\partial}{\partial y}\left(\frac{\partial f}{\partial x} \cos \theta+\frac{\partial f}{\partial y} \sin \theta\right) \frac{\partial y}{\partial x^{\prime}} \\ &+\frac{\partial}{\partial x}\left(-\sin \theta \frac{\partial f}{\partial x}+\cos \frac{\partial f}{\partial y}\right) \frac{\partial x}{\partial y^{\prime}}+\frac{\partial}{\partial y}\left(-\sin \theta \frac{\partial f}{\partial x}+\cos \frac{\partial f}{\partial y}\right) \frac{\partial y}{\partial y^{\prime}} \\ &=\frac{\partial}{\partial x}\left(\frac{\partial f}{\partial x} \cos \theta+\frac{\partial f}{\partial y} \sin \theta\right) \cos \theta+\frac{\partial}{\partial y}\left(\frac{\partial f}{\partial x} \cos \theta+\frac{\partial f}{\partial y} \sin \theta\right) \sin \theta \\ & \quad+\frac{\partial}{\partial x}\left(-\sin \theta \frac{\partial f}{\partial x}+\cos \frac{\partial f}{\partial y}\right)(-\sin \theta)+\frac{\partial}{\partial y}\left(-\sin \theta \frac{\partial f}{\partial x}+\cos \theta \frac{\partial f}{\partial y}\right) \cos \theta \\ &=\frac{\partial}{\partial x} \frac{\partial f}{\partial x}+\frac{\partial}{\partial y} \frac{\partial f}{\partial y} \\ &=\frac{\partial^{2} f}{\partial x^{2}}+\frac{\partial^{2} f}{\partial y^{2}} \end{aligned} 2f=x22f+y22f=x(xf)+y(yf)=x(xfxx+yfxy)+y(xfyx+yfyy)=x(xfcosθ+yfsinθ)+y(sinθxf+cosyf)=x(xfcosθ+yfsinθ)xx+y(xfcosθ+yfsinθ)xy+x(sinθxf+cosyf)yx+y(sinθxf+cosyf)yy=x(xfcosθ+yfsinθ)cosθ+y(xfcosθ+yfsinθ)sinθ+x(sinθxf+cosyf)(sinθ)+y(sinθxf+cosθyf)cosθ=xxf+yyf=x22f+y22f

Laplace算子优缺点

Laplace算子具有旋转不变性,适用于仅注重边缘点所处的具体位置,而对边缘点附近的实际灰度差没有要求的情况。不过在边缘检测中并不常用拉普拉斯算子,而主要是用在判断像素是在边缘亮的一面还是暗的一面,主要有以下三点原因:
(1) 二阶导数算子与一阶导数算子相比,去除噪声的能力更弱
(2) 该算子对边缘的方向检测不到
(3) 该算子的幅值会产生双边元抗噪能力弱

LOG算子

1980年,Marr和Hildreth提出将Laplace算子与高斯低通滤波相结合,提出了LOG(Laplace and Guassian)算子,又称为马尔(Marr)算子。 该算子是先运用高斯滤波器平滑图像达到去除噪声的目的,然后用 Laplace 算子对图像边缘进行检测。这样既达到了降低噪声的效果,同时也使边缘平滑,并得到了延展。为了防止得到不必要的边缘,边缘点应该选取比某阈值高的一阶导数零交叉点。 LOG 算子已经成为目前对阶跃边缘用二阶导数过零点来检测的最好的算子。

LoG解决的问题

直接使用Laplace算法,去噪的能力是非常弱的,最终提取出的边缘信息极易被噪音干扰,如下图所示
在这里插入图片描述

由图可以看出,LoG解决的最重要的问题是在提取边缘信息之前给原始图像增添一层高斯滤波器,使得原始图像的梯度异常点大大减少,最终能够更有效地提取出边缘信息。

LoG算子的计算过程

在图像处理中,常用的二维高斯函数为 :
G ( x , y , σ ) = 1 2 π σ 2 e − ( x 2 + y 2 ) / 2 σ 2 G(x, y, \sigma)=\frac{1}{2 \pi \sigma^{2}} e^{-\left(x^{2}+y^{2}\right) / 2 \sigma^{2}} G(x,y,σ)=2πσ21e(x2+y2)/2σ2

拉普拉斯算子为 :
∇ 2 f = ∂ 2 f ∂ x ′ 2 + ∂ 2 f ∂ y ′ 2 \begin{aligned} \nabla^{2} f &=\frac{\partial^{2} f}{\partial x^{\prime 2}}+\frac{\partial^{2} f}{\partial y^{\prime 2}} \end{aligned} 2f=x22f+y22f

对二维高斯函数应用拉普拉斯算子得 : ∇ 2 G = ∂ 2 G ∂ x 2 + ∂ 2 G ∂ y 2 = − 2 σ 2 + x 2 + y 2 2 π σ 6 e − ( x 2 + y 2 ) / 2 σ 2 \nabla^{2} G=\frac{\partial^{2} G}{\partial x^{2}}+\frac{\partial^{2} G}{\partial y^{2}}=\frac{-2 \sigma^{2}+x^{2}+y^{2}}{2 \pi \sigma^{6}} e^{-\left(x^{2}+y^{2}\right) / 2 \sigma^{2}} 2G=x22G+y22G=2πσ62σ2+x2+y2e(x2+y2)/2σ2

LoG(Laplacian of Gaussian)算子定义为 :
L o G = σ 2 ∇ 2 G L o G=\sigma^{2} \nabla^{2} G LoG=σ22G

注意到LoG算子,该函数轴对称,且函数的平均值为0(在定义域内),所以用它与图像进行卷积计算并不会对完整的图像动态区域有所改变,而是会使图像变模糊(因为它相当平滑),且模糊程度与σ成正比。当σ较大时,高斯滤波起到了很好的平滑效果,较大程度地抑制了噪声,但同时使一些边缘细节丢失,降低了图像边缘的定位精度;当σ比较小时,有很强的图像边缘定位精度,反而信噪比较低。因此,在应用 LOG 算子时,如何选取适当的σ值很重要,要根据边缘的定位精度的需求以及噪声情况而定 。

LoG的卷积模板

LOG 算子的卷积模板通常采用 5×5的矩阵,如:
在这里插入图片描述
计算方法
在这里插入图片描述
其中左边这个模板是在高斯标准差为0.5时的逼近,右边的模板的高斯标准差为1。Normalize是一个正则函数,它确保模板系数的总和为1. 以便在均匀亮度区域不会检测到边缘。最后由于整数比浮点数更易于计算,模板的系数都会近似为整数。

LoG算法过程

(1)遍历图像(除去边缘,防止越界),对每个像素做Gauss -Laplancian模板卷积运算。
(2)复制到目标图像,结束。

DoG与LoG

由于数学上的关系, 我们可以简化 LOG 的计算一一这便是 DOG 算子。
DoG (Difference of Gaussian ) 算子定义为
D o G = G ( x , y , σ 1 ) − G ( x , y , σ 2 ) D o G=G\left(x, y, \sigma_{1}\right)-G\left(x, y, \sigma_{2}\right) DoG=G(x,y,σ1)G(x,y,σ2)
下面我们来证明为何 DoG 能近似替代 LoG。
对二维高斯函数关于 σ \sigma σ 求一阶偏导数得
∂ G ∂ σ = − 2 σ 2 + x 2 + y 2 2 π σ 5 e − ( x 2 + y 2 ) / 2 σ 2 \frac{\partial G}{\partial \sigma}=\frac{-2 \sigma^{2}+x^{2}+y^{2}}{2 \pi \sigma^{5}} e^{-\left(x^{2}+y^{2}\right) / 2 \sigma^{2}} σG=2πσ52σ2+x2+y2e(x2+y2)/2σ2
不难发现
∂ G ∂ σ = σ ∇ 2 G \frac{\partial G}{\partial \sigma}=\sigma \nabla^{2} G σG=σ2G
D o G D o G DoG 算子中, 令 σ 1 = k σ 2 = k σ \sigma 1=k \sigma 2=k \sigma σ1=kσ2=kσ, 则
D o G = G ( x , y , k σ ) − G ( x , y , σ ) D o G=G(x, y, k \sigma)-G(x, y, \sigma) DoG=G(x,y,kσ)G(x,y,σ)
进一步地
∂ G ∂ σ = lim ⁡ Δ σ → 0 G ( x , y , σ + Δ σ ) − G ( x , y , σ ) ( σ + Δ σ ) − σ ≈ G ( x , y , k σ ) − G ( x , y , σ ) k σ − σ \frac{\partial G}{\partial \sigma}=\lim _{\Delta \sigma \rightarrow 0} \frac{G(x, y, \sigma+\Delta \sigma)-G(x, y, \sigma)}{(\sigma+\Delta \sigma)-\sigma} \approx \frac{G(x, y, k \sigma)-G(x, y, \sigma)}{k \sigma-\sigma} σG=Δσ0lim(σ+Δσ)σG(x,y,σ+Δσ)G(x,y,σ)kσσG(x,y,kσ)G(x,y,σ)
因此
σ ∇ 2 G = ∂ G ∂ σ ≈ G ( x , y , k σ ) − G ( x , y , σ ) k σ − σ \sigma \nabla^{2} G=\frac{\partial G}{\partial \sigma} \approx \frac{G(x, y, k \sigma)-G(x, y, \sigma)}{k \sigma-\sigma} σ2G=σGkσσG(x,y,kσ)G(x,y,σ)
[日]
G ( x , y , k σ ) − G ( x , y , σ ) ≈ ( k − 1 ) σ 2 ∇ 2 G G(x, y, k \sigma)-G(x, y, \sigma) \approx(k-1) \sigma^{2} \nabla^{2} G G(x,y,kσ)G(x,y,σ)(k1)σ22G
这表明 DoG 算子可以近似于 LoG 算子, 证毕。
于是, 使用 DoG 算子, 让我们只需对图像进行两次高斯平滑再将结果相减就可以近似 得到 LOG 作用于图像的效果了。
值得注意的是, 当我们用 DOG 算子代替 LOG 算子与图像卷积的时候:
D o G ( x , y , σ 1 , σ 2 ) ∗ I ( x , y ) = G ( x , y , σ 1 ) ∗ I ( x , y ) − G ( x , y , σ 2 ) ∗ I ( x , y ) D o G\left(x, y, \sigma_{1}, \sigma_{2}\right) * I(x, y)=G\left(x, y, \sigma_{1}\right) * I(x, y)-G\left(x, y, \sigma_{2}\right) * I(x, y) DoG(x,y,σ1,σ2)I(x,y)=G(x,y,σ1)I(x,y)G(x,y,σ2)I(x,y)
近似的 LOG 算子值的选取:
σ 2 = σ 1 2 σ 2 2 σ 1 2 − σ 2 2 ln ⁡ [ σ 1 2 σ 2 2 ] \sigma^{2}=\frac{\sigma_{1}^{2} \sigma_{2}^{2}}{\sigma_{1}^{2}-\sigma_{2}^{2}} \ln \left[\frac{\sigma_{1}^{2}}{\sigma_{2}^{2}}\right] σ2=σ12σ22σ12σ22ln[σ22σ12]
当使用这个值时, 可以保证 LoG 和 DoG 的过零点相同, 只是幅度大小不同。

LoG算子优缺点

值得肯定的是,LoG这种方法寻找二阶导数是很稳定的。高斯平滑有效地抑制了距离当前像素3σ范围内的所有像素的影响,这样Laplace算子就构成了一种反映图像变化的有效而稳定的度量。 但是,这种传统的二阶导数过零点技术也有缺点。第一,对形状作了过分的平滑。第二,它有产生环形边缘的倾向。

Canny算子

Canny算子概述

Canny边缘检测算法是1986年有John F. Canny开发出来一种基于图像梯度计算的边缘检测算法,同时Canny本人对计算图像边缘提取学科的发展也是做出了很多的贡献。尽管至今已经许多年过去,但是该算法仍然是图像边缘检测方法经典算法之一。
Canny 根据以前的边缘检测算子以及应用,归纳了如下三条准则:

(1) 信噪比准则:避免真实的边缘丢失,避免把非边缘点错判为边缘点;
(2) 定位精度准则:得到的边缘要尽量与真实边缘接近;
(3) 单一边缘响应准则:单一边缘需要具有独一无二的响应,要避免出现多个响应,并最大抑制虚假响应。
以上三条准则是由 Canny 首次明确提出并对这个问题进行完全解决的,虽然在他之前有人提出过类似的要求。更为重要的是, Canny 同时给出了它们的数学表达式(现以一维为例),这就转化成为一个泛函优化的问题。

Canny算子检测步骤

经典的Canny边缘检测算法通常都是从高斯模糊开始,到基于双阈值实现边缘连接结束。但是在实际工程应用中,考虑到输入图像都是彩色图像,最终边缘连接之后的图像要二值化输出显示,所以完整的Canny边缘检测算法实现步骤如下:

  1. 彩色图像转换为灰度图像
  2. 对图像进行高斯模糊
  3. 计算图像梯度,根据梯度计算图像边缘幅值与角度
  4. 非极大值抑制(边缘细化)
  5. 双阈值检测
  6. 通过抑制孤立的弱边缘完成边缘检测
  7. 二值化图像输出结果

Canny算子各步骤详解

彩色图像转换为灰度图像

根据彩色图像RGB转灰度公式:gray = R * 0.299 + G * 0.587 + B * 0.114。

对图像进行高斯模糊

为了尽可能减少噪声对边缘检测结果的影响,所以必须滤除噪声以防止由噪声引起的错误检测。为了平滑图像,使用高斯滤波器与图像进行卷积,该步骤将平滑图像,以减少边缘检测器上明显的噪声影响。大小为(2k+1)x(2k+1)的高斯滤波器核的生成方程式由下式给出:
H i j = 1 2 π σ 2 exp ⁡ ( − ( i − ( k + 1 ) ) 2 + ( j − ( k + 1 ) ) 2 2 σ 2 ) ; 1 ≤ i , j ≤ ( 2 k + 1 ) H_{i j}=\frac{1}{2 \pi \sigma^{2}} \exp \left(-\frac{(i-(k+1))^{2}+(j-(k+1))^{2}}{2 \sigma^{2}}\right) ; 1 \leq i, j \leq(2 k+1) Hij=2πσ21exp(2σ2(i(k+1))2+(j(k+1))2);1i,j(2k+1)
下面是一个sigma = 1.4,尺寸为3x3的高斯卷积核的例子(需要注意归一化):
H = [ 0.0924 0.1192 0.0924 0.1192 0.1538 0.1192 0.0924 0.1192 0.0924 ] H=\left[\begin{array}{lll}0.0924 & 0.1192 & 0.0924 \\ 0.1192 & 0.1538 & 0.1192 \\ 0.0924 & 0.1192 & 0.0924\end{array}\right] H=0.09240.11920.09240.11920.15380.11920.09240.11920.0924
若图像中一个3x3的窗口为A,要滤波的像素点为e,则经过高斯滤波之后,像素点e的亮度值为:
e = H ∗ A = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] ∗ [ a b c d e f g h i ] = sum ⁡ ( [ a × h 11 b × h 12 c × h 13 d × h 21 e × h 22 f × h 23 g × h 31 h × h 32 i × h 33 ] ) e=H * A=\left[\begin{array}{lll}\mathrm{h}_{11} & \mathrm{~h}_{12} & \mathrm{~h}_{13} \\ \mathrm{~h}_{21} & \mathrm{~h}_{22} & \mathrm{~h}_{23} \\ \mathrm{~h}_{31} & \mathrm{~h}_{32} & \mathrm{~h}_{33}\end{array}\right] *\left[\begin{array}{lll}a & b & c \\ d & e & f \\ g & h & i\end{array}\right]=\operatorname{sum}\left(\left[\begin{array}{lll}\mathrm{a} \times \mathrm{h}_{11} & \mathrm{~b} \times \mathrm{h}_{12} & \mathrm{c} \times \mathrm{h}_{13} \\ \mathrm{~d} \times \mathrm{h}_{21} & \mathrm{e} \times \mathrm{h}_{22} & \mathrm{f} \times \mathrm{h}_{23} \\ \mathrm{~g} \times \mathrm{h}_{31} & \mathrm{~h} \times \mathrm{h}_{32} & \mathrm{i} \times \mathrm{h}_{33}\end{array}\right]\right) e=HA=h11 h21 h31 h12 h22 h32 h13 h23 h33adgbehcfi=suma×h11 d×h21 g×h31 b×h12e×h22 h×h32c×h13f×h23i×h33
其中*为卷积符号,sum表示矩阵中所有元素相加求和。 重要的是需要理解,高斯卷积核大小的选择将影响Canny检测器的性能。尺寸越大,检测器对噪声的敏感度越低,但是边缘检测的定位误差也将略有增加。一般5x5是一个比较不错的trade off。

计算图像梯度,根据梯度计算图像边缘幅值与角度

图像中的边缘可以指向各个方向,因此Canny算法使用四个算子来检测图像中的水平、垂直和对角边缘。边缘检测的算子(如Roberts,Prewitt,Sobel等)返回水平Gx和垂直Gy方向的一阶导数值,由此便可以确定像素点的梯度G和方向theta 。
G = G x 2 + G y 2 G=\sqrt{G_{x}^{2}+G_{y}^{2}} G=Gx2+Gy2
θ = arctan ⁡ ( G y / G x ) \theta=\arctan \left(G_{y} / G_{x}\right) θ=arctan(Gy/Gx)
其中G为梯度强度, theta表示梯度方向,arctan为反正切函数。

非极大值抑制(边缘细化)

非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边。对图像进行梯度计算后,仅仅基于梯度值提取的边缘仍然很模糊。对于标准3,对边缘有且应当只有一个准确的响应。而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0,对梯度图像中每个像素进行非极大值抑制的算法是: 1) 将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。 2) 如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。 通常为了更加精确的计算,在跨越梯度方向的两个相邻像素之间使用线性插值来得到要比较的像素梯度,现举例如下:
在这里插入图片描述
如上图所示,将梯度分为8个方向,分别为E、NE、N、NW、W、SW、S、SE,其中0代表0°45°,1代表45°90°,2代表-90°-45°,3代表-45°0°。像素点P的梯度方向为theta,则像素点P1和P2的梯度线性插值为:
tan ⁡ ( θ ) = G y / G x \tan (\theta)=G_{y} / G_{x} tan(θ)=Gy/Gx
G p 1 = ( 1 − tan ⁡ ( θ ) ) × E + tan ⁡ ( θ ) × N E G_{p 1}=(1-\tan (\theta)) \times E+\tan (\theta) \times N E Gp1=(1tan(θ))×E+tan(θ)×NE
G p 2 = ( 1 − tan ⁡ ( θ ) ) × W + tan ⁡ ( θ ) × S W G_{p 2}=(1-\tan (\theta)) \times W+\tan (\theta) \times S W Gp2=(1tan(θ))×W+tan(θ)×SW
因此非极大值抑制的伪代码描写如下:

if G p ≥ G p 1 G_{p} \geq G_{p 1} GpGp1 and G p ≥ G p 2 G_{p} \geq G_{p 2} GpGp2
G p G_{p} Gp may be an edge
else
G p G_{p} Gp should be sup pressed
需要注意的是,如何标志方向并不重要,重要的是梯度方向的计算要和梯度算子的选取保持一致。

双阈值检测

在施加非极大值抑制之后,剩余的像素可以更准确地表示图像中的实际边缘。然而,仍然存在由于噪声和颜色变化引起的一些边缘像素。为了解决这些杂散响应,必须用弱梯度值过滤边缘像素,并保留具有高梯度值的边缘像素,可以通过选择高低阈值来实现。如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素;如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素;如果边缘像素的梯度值小于低阈值,则会被抑制。阈值的选择取决于给定输入图像的内容。
双阈值检测的伪代码描写如下:

if G p ≥ G_{p} \geq Gp HighThreshold
G p G_{p} Gp is an strong edge
else if G p ≥ G_{p} \geq Gp Low Threshold
G p G_{p} Gp is an weak edge
else
G p G_{p} Gp should be sup pressed

通过抑制孤立的弱边缘完成边缘检测

到目前为止,被划分为强边缘的像素点已经被确定为边缘,因为它们是从图像中的真实边缘中提取出来的。然而,对于弱边缘像素,将会有一些争论,因为这些像素可以从真实边缘提取也可以是因噪声或颜色变化引起的。为了获得准确的结果,应该抑制由后者引起的弱边缘。通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素及其8个邻域像素,只要其中一个为强边缘像素,则该弱边缘点就可以保留为真实的边缘。 抑制孤立边缘点的伪代码描述如下:

if G p = = G_{p}== Gp== LowThreshold and G p G_{p} Gp connected to a strong edge pixel G p G_{p} Gp is an strong edge
else
G p G_{p} Gp should be sup pressed

二值化图像输出结果

将结果二值化输出,即将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。

Canny算子优缺点

Canny 算子在二维空间的检测效果、定位性能及抗噪性能方面都更要优于 LOG 算子。
Canny 算子的不足之处是对于无噪声的图像会使图像边缘变模糊。(高斯滤波属于低通滤波,去除一些高频细节)
为使检测效果更好,我们在运用该算子时一般选取稍大的滤波尺度,但是这样做易使图像的某些边缘细节特征丢失掉。

链接: Glab.


http://chatgpt.dhexx.cn/article/bfeWQUA6.shtml

相关文章

MATLAB - 拉普拉斯算子可视化

1、拉普拉斯算子 ∇ 2 \nabla^ 2 ∇2 拉普拉斯算子有很多用途,在物理中常用于波动方程、热传导方程和亥姆霍兹方程的数学模型;在静电学中,拉普拉斯方程和泊松方程的应用随处可见;在数学中,经拉普拉斯算子运算运算为零…

一文读懂Nabla算子

文章目录 ∇ \nabla ∇算子的介绍梯度、散度和旋度不同坐标系下 ∇ \nabla ∇算子的形式 ∇ \nabla ∇算子运算律 ∇ \nabla ∇算子常用公式补充内容 参考文献及视频 ∇ \nabla ∇算子的介绍 ∇ \nabla ∇称作Nabla算子或del算子(算子是一种映射,可以理解…

【CSS 表格属性(Table)】

CSS 表格属性 Table 1. border-collapse 属性: 单元格/表格 边框 合并2. border-spacing 属性: 设置 表格/单元格 边框间距 /间隔距离 (搭配 border-collapse 属性 )3. caption-side 属性: 设置 表格标题的位置4. empty-cells 属性: 设置 表格 空单元格的显示 (空单…

html里table属性值,html——table标签属性总结

table标签属性 table标签 border border标签属性:设定围绕表格的边框的宽度:table 111111111border标签属性不仅设置围绕表格边框的宽度,还为每个单元格添加宽度为1px的边框 实际开发中不建议使用border标签属性实现边框效果,建议通过为table、th和td设定border样式属性实现…

css table属性

表格边框 指定CSS表格边框,使用border属性。 下面的例子指定了一个表格的th和td元素的黑色边框: 在上面的例子中的表格有双边框。这是因为表和th/ td元素有独立的边界。 为了显示一个表的单个边框,使用 border-collapse属性 折叠边框 border-…

elementUI表格table的列内置样式修改方法/对比template,列属性class-name,table属性cell-class-name

1,table属性cell-class-name的使用可以作用到某一行,或者某一列等等。但是在style标签中要去掉scoped,不然无效。 (在elementUI中,row-class-name、row-style、cell-class-name等属性要想生效必须使用全局class才能生…

html中table标签及属性

table表格 HTML表格由table标签以及多个tr、th和td标签组成table表示表格&#xff0c;整个表格要包含在<table></table>标签中tr表示表格中的行&#xff0c;是单元格的容器&#xff0c;一行可以包括多个单元格th表示表格中的单元格&#xff0c;我理解为列,th放在t…

Antd 3.0 table,表格组件(Table属性,Column属性,RowSelection属性)

Antd 3.0 table&#xff0c;表格组件&#xff08;Table属性&#xff0c;Column属性&#xff0c;RowSelection属性&#xff09; 一、Table属性 ​ 常用参数说明&#xff1a; 参数说明类型默认dataSource数据数组any[]columns表格列的配置描述&#xff0c;具体项见下表ColumnP…

<table>标签的属性

1.border border属性用于设置表格的边框&#xff0c;默认值为0。 2.cellspacing cellspacing属性用于设置单元格于单元格之间的空间&#xff0c;默认值为2px。 3.cellpadding cellpadding属性用于设置单元格于单元格之间的空白间距&#xff0c;默认值为1px。 4.width、h…

html-table标签属性总结

table标签属性 table标签borderwidthborder-spacingborder-collapsemargin tr标签heightbackground-colortext-alignvertical-align td标签合并单元格合并行单元格rowspan合并列单元格colspan table标签 border border标签属性&#xff1a;设定围绕表格的边框的宽度&#xff…

2.9CSS table属性

表格边框 指定CSS表格边框&#xff0c;使用border属性。 下面的例子指定了一个表格的Th和TD元素的黑色边框&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>菜鸟教程(runoob.com)</title><style&g…

Vue+Element el-table属性row-class-name用法及踩坑

el-table属性row-class-name用法及踩坑 需求前提&#xff1a;想要给表格的某一行加上不同的background&#xff0c;用来区分当前行的状态 根据官方给出的文档官方文档 在el-table中绑定自定义属性row-class-name <el-table:data"tableData"style"width: 10…

HTML中的table标签属性

表格 表格是由行和列排列而成的一种结构 HTML表格由table标签以及一个或多个tr、th或td标签组成&#xff1a; table标签用来定义表格&#xff0c;整个表格包含在<table>和</table>标签中&#xff1b; tr标签用来定义表格中一个行&#xff0c;它是单元格的容器&…

html之table属性

目标&#xff1a; 1&#xff0c;table标签属性 2&#xff0c;table通用属性 3&#xff0c;tr标签属性 4&#xff0c;td标签属性 上一节我们说了table简单结构和复杂结构&#xff0c;这一节我们来看一下table的属性 1&#xff0c;table标签属性 1&#xff0c;边框border&#xf…

table常用的几个重要属性

效果图如下&#xff1b; border 规定表格边框的宽度 cellpadding 规定单元边沿与其内容之间的空白 cellspacing 规定单元格之间的空白 width 规定表格的宽度 border-collapse: collapse; 为表格设置合并边框模型 默认值为separate rowspan跨行合并单元格 colspan跨列合并单元格…

电感 vs 磁珠

铁氧体磁珠&#xff08;(Ferrite Bead, FB&#xff09;是一种利用电感原理制作而成的元器件&#xff0c;主要用于抑制信号或电源线的高频噪声和尖峰干扰&#xff0c;还具有吸收静电脉冲的能力&#xff0c;是目前应用发展很快且廉价易用的一种抗干扰器件&#xff0c;它的原理图符…

磁珠的阻抗曲线

下面是一个典型的磁珠的频率曲线&#xff0c;我们所看到的大多数厂家的磁珠规格书&#xff0c;曲线基本都是这样的。 我们知道&#xff0c;Z表示阻抗&#xff0c;R表示电阻&#xff0c;X表示电抗。那么这三者是什么关系呢&#xff1f; 他们应该满足公式&#xff1a;ZRjX。 然而…

【电路补习笔记】7、磁珠的工作原理、磁珠的分类、磁珠的模型、磁珠的参数、磁珠与电感的区别、磁珠的应用、磁珠的误区

目录 简介铁耗磁滞损耗 磁珠归类应用对比参数用途电源滤波低通滤波器的设计 符号关于单点接地 老师的主页&#xff1a;唐老师讲电赛 视频地址&#xff1a;磁珠的工作原理&#xff0c;磁珠的分类&#xff0c;磁珠的模型&#xff0c;磁珠的参数磁珠与电感的区别&#xff0c;磁珠的…

电感和磁珠的区别

更多资料欢迎关注公众号&#xff1a;工程师看海 原文链接&#xff1a;https://mp.weixin.qq.com/s/1EI5smOwCXJxzMvWqw4mDw 禁止盗版文章 电感和磁珠外形接近&#xff0c;功能相似&#xff0c;很多人认为其都是“隔交通直”&#xff0c;以至于很多人将二者混淆。实际上&…

基本元器件——磁珠

其他基本元器件 磁珠 磁珠专用于抑制信号线、电源线上的高频噪声和尖峰干扰&#xff0c;还具有吸收静电脉冲的能力。磁珠是用来吸收超高频信号&#xff0c;像一些RF电路&#xff0c;PLL&#xff0c;振荡电路&#xff0c;含超高频存储器电路&#xff08;DDR SDRAM&#xff0c;…