Canny边缘检测算法
一、概念
Canny算法是一种经典的图像处理算法,用于图像中的边缘检测,其实现的步骤包括:
- 高斯滤波;
- 计算梯度和方向:对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数,然后计算该点的梯度大小和方向;
- 非极大值抑制:对梯度图上的每个像素,根据其梯度方向,确定在该方向上的两个相邻像素,然后检查当前像素的梯度幅度与其相邻像素的梯度比较,如果当前像素的梯度幅度大于两个相邻像素的梯度幅度,说明当前像素是局部梯度的最大值,需要保留该像素,反之,则将其值设为零;
- 滞后阈值:设置minVal和maxVal两个阈值(建议使用2:1到3:1的上/下比例),当图像的灰度梯度高于maxVal时被认为是真的边界,那些低于minVal的边界会被抛弃,如果介于两者之间的话,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是则抛弃。
二、算法接口介绍
2.1 接口1
void cv::Canny (InputArray dx,
InputArray dy,
OutputArray edges,
double threshold1,
double threshold2,
bool L2gradient = false
)
/*
InputArray dx:16位在x方向的梯度图像,一般通过Sobel算子计算得到
InputArray dy:16位在y方向的梯度图像,一般通过Sobel算子计算得到
OutputArray edges:单通道8位输出图像,与输入的尺寸一致,其中边缘像素值为255(白色),非边缘像素值为0(黑色)。
double threshold1:低阈值
double threshold2:高阈值
bool L2gradient:是否使用L2范数,默认为false,使用L1范数
*/
2.2 接口2
void cv::Canny (InputArray image,
OutputArray edges,
double threshold1,
double threshold2,
int apertureSize = 3,
bool L2gradient = false
)
/*
InputArray image:8位的输入图像
OutputArray edges:单通道8位输出图像,与输入的尺寸一致,其中边缘像素值为255(白色),非边缘像素值为0(黑色)。
double threshold1:低阈值
double threshold2:高阈值
int apertureSize:Sobel算子的大小,默认为3
bool L2gradient:是否使用L2范数,默认为false,使用L1范数
*/