Canny边缘检测算法(基于OpenCV的Java实现)
绪论
最近在学习ORB的过程中又仔细学习了Canny,故写下此篇笔记,以作总结。
Canny边缘检测算法的发展历史
Canny边缘检测于1986年由JOHN CANNY首次在论文《A Computational Approach to Edge Detection》中提出,就此拉开了Canny边缘检测算法的序幕。
Canny边缘检测是从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术,目前已广泛应用于各种计算机视觉系统。Canny发现,在不同视觉系统上对边缘检测的要求较为类似,因此,可以实现一种具有广泛应用意义的边缘检测技术。边缘检测的一般标准包括:
以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。
检测到的边缘应精确定位在真实边缘的中心。
图像中给定的边缘应只被标记一次,并且在可能的情况下,图像的噪声不应产生假的边缘。
为了满足这些要求,Canny使用了变分法。Canny检测器中的最优函数使用四个指数项的和来描述,它可以由高斯函数的一阶导数来近似。
在目前常用的边缘检测方法中,Canny边缘检测算法是具有严格定义的,可以提供良好可靠检测的方法之一。由于它具有满足边缘检测的三个标准和实现过程简单的优势,成为边缘检测最流行的算法之一。
Canny边缘检测算法的处理流程
Canny边缘检测算法可以分为以下5个步骤:
使用高斯滤波器,以平滑图像,滤除噪声。
计算图像中每个像素点的梯度强度和方向。
应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
通过抑制孤立的弱边缘最终完成边缘检测。
下面详细介绍每一步的实现思路。
用高斯滤波器平滑图像
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,特别是对抑制或消除服从正态分布的噪声非常有效。滤波可以消除或降低图像中噪声的影响,使用高斯滤波器主要是基于在滤波降噪的同时也可以最大限度保留边缘信息的考虑。
高斯滤波实现步骤:
彩色RGB图像转换为灰度图像
边缘检测是基于对图像灰度差异运算实现的,所以如果输入的是RGB彩色图像,需要先进行灰度图的转换。
RGB转换成灰度图像的一个常用公式是:
\[Gray = R*0.299 + G*0.587 + B*0.114
\]
注意一般情况下图像处理中彩色图像各分量的排列顺序是B、G、R。
RGB原图像: 转换后的灰度图:
Java代码调用系统库实现:
public static Mat RGB2Gray(Mat image) {
// Gray = R*0.299 + G*0.587 + B*0.114
Mat gray = new Mat();
Imgproc.cvtColor(image, gray, Imgproc.COLOR_BGR2GRAY);
return gray;
}
一维,二维高斯函数及分布
一维高斯函数表述为:
\[G(x) = \frac {1}{\sqrt {2\pi}\sigma}\exp(-\frac {(x-\mu_x)^2}{2\sigma^2})
\]
对应图形:
二维高斯函数表述为:
\[G(x) = \frac {1}{ {2\pi}\sigma^2}\exp(-\frac {(x-\mu_x)^2+(y-\mu_y)^2}{2\sigma^2})
\]
对应图形:
一些重要特性说明:
一维二维高斯函数中\(μ\)是服从正态分布的随机变量的均值,称为期望或均值影响正态分布的位置,实际的图像处理应用中一般取\(μ=0;~σ\)是标准差,\(σ^2\)是随机变量的方差,\(σ\)定义了正态分布数据的离散程度,\(σ\)越大,数据分布越分散,σ越小,数据分布越集中。
在图形或滤波效果上表现为:\(σ\)越大,曲线越扁平,高斯滤波器的频带就越宽,平滑程度就越好,\(σ\)越小,曲线越瘦高,高斯滤波的频带就越窄,平滑程度也越弱;
二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的.一般来说,一幅图像的边缘方向是事先不知道的,因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑.旋转对称性意味着高斯平滑滤波器在后续边缘检测中不会偏向任一方向;
高斯函数是单值函数。这表明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的。这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真;
相同条件下,高斯卷积核的尺寸越大,图像的平滑效果越好,表现为图像越模糊,同时图像细节丢失的越多;尺寸越小,平滑效果越弱,图像细节丢失越少;
以下对比一下不同大小标准差\(σ\)(Sigma)对图像平滑的影响:
原图:
卷积核尺寸5*5,σ=0.1:
卷积核尺寸5*5,σ=1:
对比可以看到,Sigma(σ)越大,平滑效果越明显。
生成高斯滤波卷积核
滤波的主要目的是降噪,一般的图像处理算法都需要先进行降噪。而高斯滤波主要使图像变得平滑(模糊),同时也有可能增大了边缘的宽度。
高斯函数是一个类似与正态分布的中间大两边小的函数。
对于一个位置(m,n)的像素点,其灰度值(这里只考虑二值图)为f(m,n)。
那么经过高斯滤波后的灰度值将变为:
\[g_\sigma(m,n)=\frac 1 {2\pi\sigma^2} \exp(-\frac {m^2+n^2}{2\sigma^2})f(m,n)
\]
其中,
\[\frac 1 { {2\pi\sigma^2}} \exp(-\frac {m^2+n^2}{2\sigma^2})
\]
是二元高斯函数。
为了尽可能减少噪声对边缘检测结果的影响,所以必须滤除噪声以防止由噪声引起的错误检测。为了平滑图像,使用高斯滤波器与图像进行卷积,该步骤将平滑图像,以减少边缘检测器上明显的噪声影响。大小为(2k+1)x(2k+1)的高斯滤波器核的生成方程式由下式给出:
下面是一个sigma = 1.4,尺寸为3x3的高斯卷积核的例子(需要注意归一化):
若图像中一个3x3的窗口为A,要滤波的像素点为e,则经过高斯滤波之后,像素点e的亮度值为: