opencv之边缘检测步骤以及常见的边缘检测算法

边缘检测的一般步骤:
1.滤波:导数对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能,常见的滤波有高斯滤波,就是采用离散化的高斯函数产生一组归一化的高斯核,然后基于高斯核函数对图像的灰度矩阵没一点进行加权求和。
2.增强:确定图像各点领域强度的变化值,增强算法可以将图像灰度点领域强度值有显著变化的点凸显出来,在编程的时候,可以通过计算梯度幅值来确定。
3.检测:对是不是边缘点进行检测,常用的方法是通过阈值化处理,

(一)边缘检测之Canny检测
Canny检测是最优的边缘检测算法:

1.消除噪声:运用高斯内核进行卷积降噪。
2.计算梯度幅值和方向。
3.非极大值抑制:这一步排除非边缘像素,仅仅保留了一些细线条(候选边缘)
4.滞后阈值:滞后阈值需要两个阈值(高阈值和低阈值):若某一个像素位置的幅值超过高阈值,该像素被保留。
:若某一个像素位置的幅值小于低阈值,该像素被排除。
:若某个像素位置的幅值在两者之间,该像素仅仅在连接到一个高于高阈值的像素时被保留。
Canny边缘检测:canny函数
C++: void Canny(InputArray Image;OutputArray edges,double threshold1,double threshold2,int apertureSize=3,bool L2gradient=false);
1.第一个参数:输入图像,单通道8位图像
2.第二个参数:输出边缘图像,需要和原图像有一样尺寸和类型
3.第三个参数:第一个滞后性阈值
4.第四个参数:第二个滞后性阈值
5.第五个参数:表示应用sobel算子的孔径大小其有默认值3
6.第六个参数:bool类型的L2gradient,一个计算图像梯度幅值的标识
阈值1和阈值2中较小的用于边缘的连接,较大的用于控制强边缘的初始段。高低阈值比在2:1和3:1之间时最佳的

2.边缘检测之Sobel检测:
Sobel算子是一个主要用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导,用来计算图像的灰度函数的近似梯度,在图像任何一点使用此算子都会产生对应的梯度矢量和其法矢量。
我们假设被作用图像为I然后进行如下操作:
(1)分别在x和y两个方向求导,进而求出近似的梯度。水平变化,垂直变化
使用Sobel算子:Sobel()函数
C++:void Sobel(I,O,int depth,int dx,int dy,int ksize=3,double scale=0,double delta=0,int borderType=BORDER_DEFAULT);
1.输入
2.输出
3.输出图像的深度
4.x方向上的差分阶数
5.y方向上的差分阶数
6.int类型的ksize,有默认值3,表示Sobel核的大小,必须取1,3,5,7.
7.double类型的scale,计算导数值时可选的缩放因子,默认值是1
8.double类型的delta,表示结果存在目标图之前可选的delta值
9.int类型的bordertype,边界模式。

3.图像边缘检测之拉普拉斯检测:
根据图像处理的原理可知,二阶导数(也就是传说中的拉普拉斯)可以用来进行边缘检测,让一幅图像减去Laplacian算子可以增强图像对比度,
C++: void Laplacian(I,O,int depth,int ksize=1,double scale=1,double delta=0,int borderType=BORDER_DEFAULT);
1.输入图像,填Mat类的对象即可,且需要单通道8位图像
2.输出边缘图像,edges需要和原图片有一样的尺寸和通道数
3.目标图像的深度
4.用于计算二阶导数滤波器的孔径尺寸,大小必须为奇数
5.计算拉普拉斯值的时候可选的比例因子
6.表示在结果存入目标图
7.int 类型的borderType

各个检测程序小博也有,欢迎大家交流讨论

你可能感兴趣的:(opencv之边缘检测步骤以及常见的边缘检测算法)