微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
概述
Blob检测在传统灰度图像分析与测量中是常用功能之一,Blob检测可以快速从灰度图像中定位跟提取各种常见的几何形状,可以根据面积、灰度值、圆度、凸度、惯量进行过滤得到符合需求的各种Blob形状,实现检测的定位与检测。支持的五种度量过滤图示如下:
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
params.filterByCircularity = False
params.minCircularity = 0.8
params.maxCircularity = 1.0
params.filterByColor = True
params.minThreshold = 50
params.maxThreshold = 100
params.filterByConvexity = False
params.minConvexity = 0.98
params.maxConvexity = 0.99
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)
运行结果如下:
根据面积过滤的Blob分析结果如下:1000~2000
根据圆度过滤的Blob分析结果如下0~0.7:
根据圆度过滤的Blob分析结果如下0.8~1.0:
根据凸度过滤的Blob分析结果如下0.98~1.0:
找到了唯一没有缺口的圆
根据惯量过滤的Blob分析结果如下0.0~0.2:
直线的惯量接近于0, 圆的惯量接近于1
推荐阅读
大道至简 | CV系统化学习路线图发布了!
Pytorh轻松学系列 - 视频课程版本发布了!
OpenCV4 C++学习 必备基础语法知识三
OpenCV4 C++学习 必备基础语法知识二