Canny 介绍
Canny 介绍
Canny算子与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法。John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标:
- 1 好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低;
- 2 高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;
- 3 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边缘应该得到最大抑制。
Canny检测实现过程
第一步:灰度化
第二步:高斯滤波
- 首先生成二维高斯分布矩阵:
$$
G(x, y)=\frac{1}{2 \pi \sigma^{2}} e^{\frac{-\left(x^{2}+y^{2}\right)}{2 \sigma^{2}}}
$$
- 然后与灰度图像进行卷积实现滤波:
$$
f_{s}(x, y)=f(x, y) * G(x, y)
$$
第三步:计算梯度值和方向
求变化率时,对于一元函数,即求导;对于二元函数,求偏导。数字图像处理中,用一阶有限差分近似求取灰度值的梯度值(变化率)。 (即:使差商(Δf/Δx)近似取代微商(∂f/∂x)。求灰度的变化率,分别取x和y方向上相邻像素做差,代替求取x和y 方向一阶偏导) 。
$$
\begin{aligned}
&P[i, j]=(f[i+1, j]-f[i, j]+f[i+1, j+1]-f[i, j+1]) / 2 \
&Q[i, j]=(f[i, j]-f[i, j+1]+f[i+1, j]-f[i+1, j+1]) / 2 \
&M[i, j]=\sqrt{P[i, j]^{2}+Q[i, j]^{2}} \
&\theta[i, j]=\arctan (Q[i, j] / p[i, j])
\end{aligned}
$$
其中f为图像灰度值,P代表X方向梯度幅值,Q代表Y方向 梯度幅值,M是该点幅值,Θ是梯度方向,也就是角度。
注:图像梯度方向与边缘方向互相垂直:
第四步:非极大值抑制(NMS)
通俗意义上是指寻找像素点局部最大值。沿着梯度方向,比较它前面和后面的梯度值。在沿其方向上邻域的梯度幅值最大,则保留;否则,抑制。
第五步:双阈值的选取,边缘连接
- 选取高阈值 T H 和低阈值 T L, 比率为2:1或3:1. (一般取 TH = 0.3 或 0.2, TL = 0.1)
- 取出非极大值抑制后的图像中的最大梯度幅值,重新定义高低阈值。即 TH * Max, TL * Max。
- 将小于TL的点抛弃,赋0;将大于TH的点立即标记(这些点就是边缘点),赋1。
- 将大于TL, 小于TH的点使用8连通区域确定(即:只有与TH像素连接时才会被接受,成为边缘点,赋1).
Canny检测Python实现
1 | # -*- coding: utf-8 -*- |