开发环境为:win10+QT5.8+opencv3.2
数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础,图像分析和理解的第一步往往就是边缘检测。轮廓跟踪是获取图像的外部轮廓特征,为图像的形状分析做准备。本文主要实现图像边缘检测、轮廓提取、轮廓跟踪。
一、读取图像
读取图像见QT+opencv学习笔记(1)——图像点运算,这里不再赘述。
读取结果如下图:
二、边缘检测
边缘是指图像局部强度变化最显著的部分。边缘主要存在与目标与目标、目标与背景、区域与区域之间。图像强度的不连续性可分为:阶跃不连续,即图像强度在不连续处的两边的像素灰度值有显著的差异;线条不连续,即图像强度从一个值变化到另一个值,保持一较小行程后又回到原来的值。
边缘检测算子检查每个像素的邻域并对灰度变换率进行量化,也包括方向的确定。大多数使用基于方向倒数掩模求卷积的方法。
下面介绍几种常用的边缘检测算子。
Canny算子
Canny算子运用比较广泛。是在Sobel算子的基础上改进的。
Canny算子的步骤是:
1.先进行滤波降噪。
2.计算梯度幅值和方向(进行Sobel算子计算)。
3.非极大值抑制。
4.滞后阈值。
Canny边缘检测可通过Canny()函数来实现。Canny()函数的定义如下:
//推荐高低阈值比例介于2:1与3:1之间
void Canny(InputArray image, //8位单通道输入图像
OutputArray edges, //输出图像,和输入图像的尺寸类型一致
double threshold1, //滞后阈值低阈值(用于边缘连接)
double threshold2, //滞后阈值高阈值(控制边缘初始段)
int apertureSize=3, //表示Sobel算子孔径大小,默认为3
bool L2gradient=false //计算图像梯度幅值的标识
);
Canny边缘检测主要代码如下:
//Canny边缘检测
Canny(grayImg, edgeImg, 30, 80);
Canny边缘检测处理结果如下: