Canny边缘检测算法

一、概念

Canny算法是一种经典的图像处理算法,用于图像中的边缘检测,其实现的步骤包括:

  1. 高斯滤波
  2. 计算梯度和方向:对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数,然后计算该点的梯度大小和方向;
  3. 非极大值抑制:对梯度图上的每个像素,根据其梯度方向,确定在该方向上的两个相邻像素,然后检查当前像素的梯度幅度与其相邻像素的梯度比较,如果当前像素的梯度幅度大于两个相邻像素的梯度幅度,说明当前像素是局部梯度的最大值,需要保留该像素,反之,则将其值设为零;
  4. 滞后阈值:设置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范数 
*/
posted @ 2024-06-11 19:10  珠峰上吹泡泡  阅读(4)  评论(0编辑  收藏  举报