AI学习者 · 2021年08月23日

OpenCV中的Blob分析演示

概述

Blob检测在传统灰度图像分析与测量中是常用功能之一,Blob检测可以快速从灰度图像中定位跟提取各种常见的几何形状,可以根据面积、灰度值、圆度、凸度、惯量进行过滤得到符合需求的各种Blob形状,实现检测的定位与检测。支持的五种度量过滤图示如下:
image.png

OpenCV中支持函数

OpenCV中已经实现了Blob对象检测算法,对应的函数如下:


cv::SimpleBlobDetector::create (
  const SimpleBlobDetector::Params & parameters =SimpleBlobDetector::Params()
)
参数支持如下:
uchar      blobColor

// 支持的五种过滤方式

bool filterByArea // 面积过滤,True表示启用
bool filterByCircularity // 圆度过滤,True表示启用
bool filterByColor // 值过滤,True表示启用
bool filterByConvexity // 凸度过滤,True表示启用
bool filterByInertia // 惯量过滤,True表示启用

// 每种方式的最小与最大参数阈值

float        maxArea
float        maxCircularity
float        maxConvexity
float        maxInertiaRatio
float        maxThreshold
float        minArea
float        minCircularity
float        minConvexity
float        minDistBetweenBlobs
float        minInertiaRatio
size_t       minRepeatability
float        minThreshold
float        thresholdStep

其中 圆度、凸度、惯量的取值范围均为[0, 1]之间。输入灰度图像,调用之后输出的是KeyPoint数据结构的List,其中KeyPoint结构中pt表示返回的每个Blob的中心位置,size表示宽度/直径。

案例:Blob分析

创建Blob对象与初始化参数设置的代码如下:

params = cv.SimpleBlobDetector_Params()
# 面积过滤
params.blobColor = False
params.filterByArea = False
params.minArea = 100
params.maxArea = 800

# 圆度过滤, 取值范围 0 ~ 1
params.filterByCircularity = False
params.minCircularity = 0.8
params.maxCircularity = 1.0

# 颜色过滤
params.filterByColor = True
params.minThreshold = 50
params.maxThreshold = 100

# 凸度过滤, 取值范围 0 ~ 1
params.filterByConvexity = False
params.minConvexity = 0.98
params.maxConvexity = 0.99

# 惯量过滤, 取值范围 0 ~ 1
params.filterByInertia = False
params.minInertiaRatio = 0.8
params.maxInertiaRatio = 1.0

detector = cv.SimpleBlobDetector.create(params)

检测代码与运行结果如下:

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
keypoints = detector.detect(gray)
for kp in keypoints:
         cv.circle(image, (np.int(kp.pt[0]), np.int(kp.pt[1])), 3, (0, 255, 0), -1, 8)
         cv.circle(image, (np.int(kp.pt[0]), np.int(kp.pt[1])), np.int(kp.size/2), (0, 0, 255), 2, 8)

运行结果如下:

image.png

根据面积过滤的Blob分析结果如下:1000~2000

image.png

根据圆度过滤的Blob分析结果如下0~0.7:

image.png

根据圆度过滤的Blob分析结果如下0.8~1.0:

image.png

根据凸度过滤的Blob分析结果如下0.98~1.0:

image.png

找到了唯一没有缺口的圆

根据惯量过滤的Blob分析结果如下0.0~0.2:

image.png
直线的惯量接近于0, 圆的惯量接近于1

原文:OpenCV学堂
作者: gloomyfish

推荐阅读

更多嵌入式AI技术相关内容请关注嵌入式AI专栏。
推荐阅读
关注数
18808
内容数
1352
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息