OpenCV中BLOB特征提取与几何形状分类
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::Params params;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函数熟悉程度与图像处理相关知识的掌握程度。
- python mongodb爬取58网站
- 洛谷P1143 进制转换
- python爬取链家租房之获取北京所有区的网站分栏地址(第一次写,code太粗犷,欢迎提建议)
- Pandas-Series知识点总结
- Numpy基础知识点汇总
- P3388 【模板】割点(割顶)
- python爬取链家租房之获取房屋的链接和页面的详细信息
- 信用卡“坏账”客户分析(一)
- 一道简单的sql语句题
- python爬虫反爬取---设置User Agent自动变换header文件
- 一文读懂Python多线程
- 深入理解Python变量作用域与函数闭包
- TensorFlow从1到2 - 5 - 非专家莫入!TensorFlow实现CNN
- JetBrains Rider 破解 (ideaIU等等开发工具都通用)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mycat分库分表全解析 Part 3 Mycat的安装
- Oracle非图形化界面创建数据库
- Mycat分库分表全解析 Part 5 Mycat 分片规则介绍
- PHP 命名空间与类自动加载实现
- mysqldump命令详解 Part 3-备份单表
- mysqldump命令详解 Part 7- -single-transaction 参数的使用
- 基于 Symfony 组件封装 HTTP 请求响应类
- 通过 PHP 原生代码实现 HTTP 路由器
- MySQL组复制(MGR)全解析 Part 10 MGR新增节点
- 基于 gorilla/sessions 在 Go 语言中管理 Session
- 通过 PHP 原生代码实现 HTTP 控制器
- Go 视图模板篇(一):模板引擎的定义、解析与执行
- Mycat分库分表全解析 Part 6 Mycat 全局序列号
- 通过 PHP 原生代码实现视图模板引擎的解析和渲染
- [MySQL故障处理]记一次innobackupex导致的从库无法同步的问题