×

OpenCV中BLOB特征提取与几何形状分类

hqy hqy 发表于2025-03-04 14:18:30 浏览8 评论0百度已收录

抢沙发发表评论

OpenCV中BLOB特征提取与几何形状分类

一:方法

二值图像几何形状提取与分离,是机器视觉中重点之一,在CT图像分析与机器人视觉感知等领域应用广泛,OpenCV中提供了一个对二值图像几何特征描述与分析最有效的工具 - SimpleBlobDetector类,使用它可以实现对二值图像几何形状的分离与分析。而它之所以强大是因为整合OpenCV中其它一些API的功能,主要是有三个:

自动的图像灰度与二值化,根据输入的步长与阈值,得到半径

实现了轮廓查找功能,可以查找所有轮廓,

然后在此基础上基于几何矩的计算实现各种基于几何特征的过滤

在学习Blob特征检测器相关函数之前,我们首先看一下Blob几何特征过滤时候用到几何特征

面积

BLOB特征检测器可以根据面积大小对结果进行过滤,只有面积在指定范围内的几何形状才会被BLOB特征检出并标注。这样就可以通过它实现基于几何形状面积的大小分类。需要说明的是这里的面积是基于像素单位的,主要是利于几何矩进行计算得到。

圆度

圆度的公式可以表示为 

当C等于1时候,该形状表示一个完美的圆形

当C趋近于0的时候,该形状表示接近于直线的多边形或者矩形。

当C值在0.75 ~ 0.85之间的时候,多数的时候表示与矩形或者等边的多边形出现。

惯性率

惯性率是跟偏心率,圆形的偏心率等于0, 椭圆的偏心率介于0和1之间,直线的偏心率接近于0, 基于几何矩计算惯性率比计算偏心率容易,所以OpenCV选择了惯性率这个特征值,根据惯性率可以计算出来偏心率,偏心率与惯性率之间关系表示如下

凸度

表示几何形状是凸包还是凹包的度量。说白了就是可以根据参数过滤凸多边形还是凹多边形, 输入的参数一般在0~1之间,最小为0,最大为1。一般圆形多会大于0.5以上

二 演示

演示部分通过两个例子来说明BLOB特征不同用法,第一个例子通过BLOB特征检测向日葵的葵盘,第二例子通过BLOB特征检测来对几何形状进行过滤分类。

示例一 :原图

BLOB检测结果

相关的代码如下:

// 初始化BLOB参数

SimpleBlobDetector::Paramsparams;

params.minDistBetweenBlobs =0.0f;

params.filterByInertia =false;

params.filterByConvexity =false;

params.filterByColor =false;

params.filterByCircularity =false;

params.filterByArea =false;

// 声明根据面积过滤,设置最大与最小面积

params.filterByArea =true;

params.minArea =20.0f;

params.maxArea =2000.0f;

// 声明根据圆度过滤,设置最大与最小圆度

params.filterByCircularity =true;

params.minCircularity =0.5;

params.maxCircularity =1.0;

// 凸包形状分析 - 过滤凹包

params.filterByConvexity =true;

params.minConvexity =0.5;

params.minConvexity =1.0;

// 参数初始化BLOB检测器,

Ptr<SimpleBlobDetector> detector =SimpleBlobDetector::create(params);

vector<KeyPoint> keypoints;

// 检测得到特征与绘制特征

detector->detect(src, keypoints,Mat());

Mat kp_image;

drawKeypoints(src, keypoints, kp_image,Scalar(255,0,0),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

imshow("keypoints", kp_image);

示例二:原图

参数不同过滤运行结果

蓝色与红色是检测结果表示

相关代码如下

// 几何形状过滤

// 声明根据面积过滤,设置最大与最小面积

params.filterByArea =true;

params.minArea =1000.0f;

params.maxArea =12000.0f;

// 声明根据圆度过滤,设置最大与最小圆度

params.filterByCircularity =true;

params.minCircularity =0.7;

params.maxCircularity =0.8;

// 凸包形状分析 - 过滤凹包

params.filterByConvexity =true;

params.minConvexity =0.0;

params.minConvexity =0.5;

// 参数初始化BLOB检测器,

Ptr<SimpleBlobDetector> detector =SimpleBlobDetector::create(params);

vector<KeyPoint> keypoints;

// 检测得到特征与绘制特征

detector->detect(src, keypoints,Mat());

Mat kp_image;

drawKeypoints(src, keypoints, kp_image,Scalar(0,0,255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

imshow("keypoints", kp_image);

总结:

图像的BLOB特征提取与分析,除了使用SimpleBlobDetector类之外还可以通过findContours与几何矩Moments计算相结合来实现。后者更加考察对OpenCV相关API函数熟悉程度与图像处理相关知识的掌握程度。

最怕一生碌碌无为

还安慰自己平凡可贵

更多精彩内容请关注扫码

+OpenCV学习群 376281510

进群暗号:OpenCV