边缘检测之Canny算法_Qt实现(C++)
Canny边缘检测算法的简单介绍
Canny的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
- 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘。
- 好的定位 - 标识出的边缘要与实际图像中的实际边缘尽可能接近。
- 最小响应 - 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。
为了满足这些要求Canny使用了变分法,这是一种寻找满足特定功能的函数的方法。最优检测使用四个指数函数项的和表示,但是它非常近似于高斯函数的一阶导数。
Canny算法的步骤
- 1、灰度处理
- 2、降噪,使用高斯滤波器,以平滑图像,滤除噪声。
- 3、计算图像中每个像素的亮度梯度和方向。
- 4、应用非极大值抑制(Non-Maximum Suppression),以消除边缘检测带来的杂散响应。
- 5、应用双阙值检测(Double-Threshold)来确定真实的和潜在的边缘。
- 6、通过抑制孤立的弱边缘最终完成边缘检测。
Canny算法详细步骤
- 1、灰度处理
边缘检测算法处理的是灰度图像,如果是rgb图像,需要先转化为灰度图像。 - 2、高斯平滑滤波
任何边缘检测算法都不可能在未经处理的原始数据上很好的处理,所以第一步是对原始数据与高斯滤波器做卷积,得到的图像与原始图像相比有些轻微的模糊。使得单独的一个像素噪声在经过高斯平滑的图像上变得几乎没有影响。
若图像中一个3*3的窗口为A,要滤波的像素点为e,则经过高斯滤波后,像素点e的亮度值为:
e=H∗A=⎡⎣⎢h11h21h31h12h22h32h13h23h33⎤⎦⎥∗⎡⎣⎢aadgbehcfi⎤⎦⎥=sum⎡⎣⎢a∗h11d∗h21g∗h31b∗h12e∗h22h∗h32c∗h13f∗h23i∗h33⎤⎦⎥ e = H ∗ A = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] ∗ [ a a b c d e f g h i ] = s u m [ a ∗ h 11 b ∗ h 12 c ∗ h 13 d ∗ h 21 e ∗ h 22 f ∗ h 23 g ∗