边缘检测
一、边缘检测的理解
边缘一般是指图像在某一局部强度剧烈变化的区域。强度变化一般有两种情况:
阶跃变化: 像数值从低到高变化,图像从暗到亮
山顶变化:由暗到亮再到暗,两边较暗,中心突出
边缘检测实际上是找到两种强度变化的集合。
既然边缘是灰度变化最剧烈的位置,最直观的想法就是求差分(相邻像素点的差值)。
用差分的方法进行边缘检测必须使差分的方向和边缘的方向相垂直,这就需要对图像的不同方向分别进行差分运算,增加了运算量。一般可将边缘分为水平边缘、垂直边缘和对角线边缘。
对于第一种情况:一阶差分的峰值为边缘点,二阶差分的零点为边缘点。
对于第二种情况:一阶差分的零点为边缘点,二阶差分的峰值为边缘点。
二、常用边缘检测算子
1、普通梯度算子:
普通梯度算子也叫正交梯度算子,分别求像素点上方与像素点的梯度和像素点左边与像素点的梯度值。
[ 0 0 [0 1
−1 1] 0 -1]
2、Roberts算子:
Roberts算子与普通梯度算子类似,都是取一阶的差分作为梯度,区别在于取值的位置:对角取值
3、Prewitt算子:
Prewitt结合了差分与邻域平均的思想,其卷积核如下
水平卷积核: 垂直卷积核
4、Sobel算子:
Sobel算子是在Prewitt算子的基础上加入了权值的思想,离像素点越近权值越高
5、拉普拉斯算子:
拉普拉斯变换是工程数学中常用的一种积分变换;拉普拉斯算子是n维欧几里得空间的一个二阶微分算子;
6、LoG算子:
Laplacian of Gaussian,就是高斯拉普拉斯算子,原理为对高斯分布公式进行二阶微分
高斯函数为:
7、Canny算子:
Canny算子分为四步:图像降噪、计算图像梯度、非极大值抑制、阈值筛选
1.图像降噪
梯度算子本质上是描述图像灰度突出值的算子,所以受到噪声影响很大,因为噪声表现为突出的异常数据点,所以第一步需要降噪,一般使用高斯滤波降噪;
2.计算图像梯度
计算图像梯度能够得到图像的边缘,因为梯度是灰度变化明显的地方,而边缘也是灰度变化明显的地方。当然这一步只能得到可能的边缘。因为灰度变化的地方可能是边缘,也可能不是边缘。这一步就有了所有可能是边缘的集合。
在OpenCV中默认使用Sobel算子作为梯度算子。
3.非极大值抑制
通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。这一步的主要目的为瘦边缘,需要结合梯度方向与梯度值来判断;
将梯度分为8个方向,分别为E、NE、N、NW、W、SW、S、SE(这实际上也为像素点),
其中0代表0度到45度,1代表45度到90度,2代表-90度到-45度,3代表-45度到0度。
4.阈值筛选
通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low),高阈值(high)。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。
OpenCV的函数有两种:
第一种为输入两个不同的互相正交的梯度图:
CV_EXPORTS_W void Canny( InputArray dx, InputArray dy,
OutputArray edges,
double threshold1, double threshold2,
bool L2gradient = false );
InputArray dx:x方向的梯度算子,如sobel算子的x算子;
InputArray dx:y方向的梯度算子,如sobel算子的y算子;
double thresh