Blob,这里译为斑点,可以理解为一幅图像中的显著区域。由于其代表的是一个连通区域,在图像匹配中相比于单纯的点具有更高的稳定性。本文将介绍OpenCV中集成的一个简单检测器,SimpleBlobDetector。在此之前,先理解几个算法中会用到的重要概念。

Circularity,圆度 圆度是一个反映图形接近于完美圆的程度,其范围为(0,1)。如果该值越接近于0,则该图形越接近一个无限拉长的矩形;如果该值越接近于1,则该图形越接近于一个完美的圆。圆度的计算公式如下: R o u n d n e s s = 4 π S C 2 (1) {\rm Roundness} =\frac{4\pi S}{C^2}\tag{1} Roundness=C24πS​(1)

其中,S表示该图形的面积,C表示该图形的周长。

InertiaRatio,惯性率 首先,偏心率是指某一个椭圆轨道于理想圆形的偏离程度,长椭圆轨道的偏心率高,而近于圆形的轨道的偏心率低,偏心率的大小范围为[0,+∞)。对于本文来说,椭圆的偏心率范围为(0,1),当该值越接近于0,则椭圆越;当该值越接近于1,则该椭圆越。偏心率的计算公式如下: e = c a (2) e=\frac{c}{a}\tag{2} e=ac​(2)

其中,c表示椭圆的半焦距,a表示椭圆的半长轴。其次,惯性率i与偏心率e具有如下关系: e 2 + i 2 = 1 (3) e^2+i^2=1\tag{3} e2+i2=1(3)

通过偏心率与惯性率的关系可以得到:惯性率越接近于0,则该图形越扁;惯性率越接近于1,则该图形越圆。

Convexity,凸度 首先,对于一个图形F以及任意两个位于图形F内的点A和B,若线段AB上的所有点恒位于图形F内,则称该图形F为凸图形;反之则称图像F为凹图形。如以下图形均为凸图形:

如以下图形为凹图形:

凸度定义为多边形接近凸图形的程度,凸图形的凸度为1,凹图形的凸度计算如下:
C o n v e x i t y = S H (4) {\rm Convexity}=\frac{S}{H}\tag{4} Convexity=HS​(4)

其中,S表示该图形的面积,H表示该图形对应的凸壳的面积。凸壳定义:令K是平面上的一个点集,封闭K中所有顶点的最小凸图形称为K的凸壳。即,将凹图形变成凸图形时所形成的最小凸图形。如上凹图形的凸壳为:

本文所使用的检测器是OpenCV中集成的检测器。

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main(int argc, char** argv) {// 读入图像,并将其转换为灰度形式Mat img = imread("blob.jpg", IMREAD_GRAYSCALE);// 定义SimpleBlobDetector检测器参数SimpleBlobDetector::Params params;// 检测区域大小的控制并滤除面积小于1500的区域params.filterByArea = true;params.minArea = 1500;// 设置最小及最大阈值params.minThreshold = 10;params.maxThreshold = 200;// 检测区域形状的控制并滤除圆度小于0.1的区域params.filterByCircularity = true;params.minCircularity = 0.1;// 检测区域惯性率的控制并滤除惯性率小于0.01的区域params.filterByInertia = true;params.minInertiaRatio = 0.01;// 检测区域凸性的控制并滤除凸度小于0.87的区域params.filterByConvexity = true;params.minConvexity = 0.87;// 定义关键点集合vector<KeyPoint> keypoints;#if CV_MAJOR_VERSION < 3    // 使用OpenCV2.x// 初始化检测器SimpleBlobDetector detector(params);// 调用检测函数detector.detect(img, keypoints);
#else // 初始化检测器Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);// 调用检测函数detector->detect(img, keypoints);
#endif// DrawMatchesFlags::DRAW_RICH_KEYPOINTS表示在绘制特征点时会绘制特征点位置、大小和方向Mat img_with_keypoints;drawKeypoints(img, keypoints, img_with_keypoints, Scalar(0, 0, 255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);// 绘制检测结果imshow("keypoints", img_with_keypoints);waitKey(0);return 0;
}

首先来看测试图像:

第一行检测对象为图形面积,第二行检测对象为像素阈值,第三行检测对象为图形圆度,第四行检测对象为惯性率,第五行检测对象为图形凸度。检测结果如下:


参考

  1. https://github.com/spmallick/learnopencv/tree/master/BlobDetector.


(四)OpenCV | 斑点检测相关推荐

  1. opencv图像特征检测之斑点检测

    2019独角兽企业重金招聘Python工程师标准>>> 前面说过,图像特征点检测包括角点和斑点,今天来说说斑点,斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的 ...

  2. keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)

    人脸识别热门,表情识别更加.但是表情识别很难,因为人脸的微表情很多,本节介绍一种比较粗线条的表情分类与识别的办法. Keras系列: 1.keras系列︱Sequential与Model模型.kera ...

  3. Android版OpenCV图像处理技术亲自验证[三]之斑点检测ColorBlobDetector

    Android版OpenCV图像处理技术亲自验证[二]之斑点检测ColorBlobDetector 程序之美 前言 主体 运行效果 构建过程 核心代码 所遇问题 结束语 程序之美 前言 OpenCV是 ...

  4. 【opencv】 斑点检测 impleBlobDetector

    1. 什么是斑点 斑点通常是指与周围有着颜色和灰度差别的区域.在实际地图中,往往存在着大量这样的斑点,如一颗树是一个斑点,一块草地是一个斑点,一栋房子也可以是一个斑点.由于斑点代表的是一个区域,相比单 ...

  5. 基于局部极值的分水岭算法的圆斑点检测

    本次实验利用了基于局部极值的分水岭算法来实现圆斑点的检测.在OPENCV中提供了simpleBlobDetector特征检测器来实现这种斑点检测算法,正如它的名称,该算法使用最简单的方式来检测斑点类的 ...

  6. Python 斑点检测 SimpleBlobDetector

    OpenCV 常用函数 斑点检测 SimpleBlobDetector_create 定义 斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具 ...

  7. 使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)

    使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones) 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何只使用基本的图 ...

  8. OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)

    OpenCV与图像处理学习十七--OpenCV人脸检测(含代码) 一.人脸识别概要 1.1 人脸检测 1.2 人脸对齐(Face Alignment) 1.3 人脸特征提取(Face Feature ...

  9. OpenCV3学习(11.4)斑点检测 SimpleBlobDetector

    1. 什么是斑点 图像特征点检测包括角点和斑点,今天来说说斑点,斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰 ...

最新文章

  1. MySQL Workbench
  2. “外部质量”还是“内部质量”
  3. Linux getcwd()的实现【转】
  4. 数据挖掘常用的方法(分类,回归、聚类、关联规则)
  5. Ubuntu下如何正确安装FFmpeg
  6. java ntpudpclient_使用NTP获取网络时间-----java
  7. nginx中文url php,使Nginx服务器支持中文URL的相关配置详解
  8. Python版本微信跳一跳,软件配置
  9. 2021泰州高考成绩查询时间,2021年江苏省高考时间确定!
  10. LDAP认证的两种方式
  11. java htmlunit
  12. 我上半年深陷泥淖的往事
  13. 用JAVA写出1到999的随性化数_OO第一单元——谜之随性总结
  14. sql 大于号小于号显示问题
  15. matlab有限元三角,FEM-MATLAB(75) 有限元编程75个案例,梁、板等结构,三角形,四边形等单元 Algorithm 数学计算 272万源代码下载- www.pudn.com...
  16. 財智V6.0(完美破解序列号特别版)
  17. Mac,obs桌面音频禁用,无法录制系统声音,问题修复最佳实践!
  18. 两分钟永久搞定Github加速问题!!!
  19. 简易 PWM 信号发生器的设计与制作
  20. python win32转pdf 横版_用Python将PPT转换PDF

热门文章

  1. css如何设置轮播速度,css轮播图如何实现?
  2. ROUND(IF(J7150,150*D7,J7*D7),1) excl这个函数是什么意思
  3. 常刺激人体五个部位可强健身体
  4. 阿里云短信验证(代码)demo完整教程
  5. PHP阿里云短信服务
  6. 仿站利器!一键去除冗余css
  7. MIPI之DBI\DPI\DSI\DCS简介
  8. Seal Report 使用教程(四)设计图形报表
  9. Android开发到底做什么?
  10. 弹跳球游戏html,css如何实现弹跳球动画效果?