OpenCV4开发入门教程129:BLOB特征分析-SimpleBlobDetector使用

索引地址:系列索引

BLOB

blob

Blob是图像中共享某些共同属性(例如灰度值)的一组连接的像素。在上图中,暗连通区域是Blob,Blob检测的目的就是识别和标记这些区域。

blob分析一般用于图像分割或连通性分析,OpenCV提供了一种方便的方法来检测Blob,并根据不同的属性对其进行过滤。

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;
int main()
{
Mat src=imread("circles.jpg");
//*参数设置,以下都是默认参数
SimpleBlobDetector::Params pDefaultBLOB;
pDefaultBLOB.thresholdStep = 10;
pDefaultBLOB.minThreshold = 50;
pDefaultBLOB.maxThreshold = 220;
pDefaultBLOB.minRepeatability = 2;
pDefaultBLOB.minDistBetweenBlobs = 10;
pDefaultBLOB.filterByColor = true;
pDefaultBLOB.blobColor = 0;
pDefaultBLOB.filterByArea = true;
pDefaultBLOB.minArea = 25;
pDefaultBLOB.maxArea = 5000;
pDefaultBLOB.filterByCircularity = false;
pDefaultBLOB.minCircularity = 0.8f;
pDefaultBLOB.maxCircularity = (float)3.40282e+038;
pDefaultBLOB.filterByInertia = true;
pDefaultBLOB.minInertiaRatio = 0.1f;
pDefaultBLOB.maxInertiaRatio = (float)3.40282e+038;
pDefaultBLOB.filterByConvexity = true;
pDefaultBLOB.minConvexity = 0.95f;
pDefaultBLOB.maxConvexity = (float)3.40282e+038;
//*用参数创建对象
Ptr<SimpleBlobDetector> blob=SimpleBlobDetector::create(pDefaultBLOB);
//*blob检测
vector<KeyPoint> key_points;
blob->detect(src,key_points);
Mat outImg;
//*绘制结果
drawKeypoints(src,key_points,outImg,Scalar(0,0,255));
imshow("blob",outImg);

waitKey();
return 0;
}

效果为

blob

奇异区域检测

奇异区域通常是指与周围领域有着某些特征(颜色和灰度)差别的区域,常见的奇异区域如医学领域X光照片或CT某些特定组织,天空中降落等,奇异区域相对于点区域检查更稳定,在目标分割及检测、图像配准、特征分析等领域得到了广泛应用。

计算机视觉中我们常常关注目标的特征是颜色和灰度,刻画图像中两个区域的视觉相似性有许多方法,如形状描述子、颜色特征、矩特征等。对于某种场景下的应用,具有独特纹理的对象可以使用一个很好的纹理描述符。对颜色不同的区域中的单个对象做相同的扩展,我们可以使用颜色特征来测量对象的不同部分的相似性。利用色彩空间表达RGB颜色空间直方图不能很好地表示颜色扩散现象,因此利用HSV色调饱和度纯度来计算其相应的直方图信息。

在计算机视觉中,奇异区域检测主要是通过微分检测或局部极值的分水岭算法实现的。基于图像中的奇异区域的邻域像素值或大或小的特征,我们可以通过计算图像中的局部极值点来实现相应兴趣区域的检测。奇异区域检测一般采用下面两种方法来实现:

  • 基于检测检测器检测
  • 基于局部极值的分水岭检测
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 功能:代码 7-7 奇异区域检测
// 作者:朱伟 zhu1988wei@163.com
// 来源:《OpenCV图像处理编程实例》
// 博客:http://blog.csdn.net/zhuwei1988
// 更新:2016-8-1
// 说明:版权所有,引用或摘录请联系作者,并按照上面格式注明出处,谢谢。//
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
int main()
{
cv::Mat srcImage =
cv::imread("..\\images\\flow.jpg");
if (!srcImage.data)
return -1;
cv::imshow("srcImage", srcImage);
// 向量关键点
std::vector<KeyPoint> keypoints;
// blob类定义
SimpleBlobDetector::Params params;
// 参数定义
params.filterByArea = true;
params.minArea = 10;
params.maxArea = 100;
Ptr<SimpleBlobDetector> blobDetector = SimpleBlobDetector::create(params);
// 奇异区域检测
blobDetector->detect(srcImage, keypoints);
// 绘制关键点
drawKeypoints(srcImage, keypoints,
srcImage, Scalar(255, 0, 0));
cv::imshow("result", srcImage);
cv::waitKey();
return 0;
}

效果

blob

OpenCV4开发入门教程129:BLOB特征分析-SimpleBlobDetector使用
https://feater.top/opencv/opencv-simpleblobdetector
作者
JackeyLea
发布于
2020年10月6日
许可协议