共计 1566 个字符,预计需要花费 4 分钟才能阅读完成。
一、为什么需要 Blob 分析?
传统像素级处理就像用放大镜观察每个小格子(像素),而 Blob 分析则是把注意力放在连成片的『色块团』上。想象我们要数一张照片中的硬币数量——Blob 方法能直接识别每个圆形区域,而不用逐个像素判断。

二、Blob 检测全流程拆解
- 二值化处理
像给照片『去色』,只保留黑白两色。OpenCV 中常用cv2.threshold(),注意选择适合的阈值类型(如 OTSU 自动阈值)。
# 示例:自适应阈值处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
-
连通域分析
通过cv2.findContours()找相连的白色区域,就像用笔勾勒出每个色块的边缘。关键参数RETR_EXTERNAL表示只检测最外层轮廓。 -
特征提取
计算每个 Blob 的『身份证信息』: - 面积:
cv2.contourArea(contour) - 周长:
cv2.arcLength(contour, True) - 圆形度:4π* 面积 / 周长²(越接近 1 越圆)
三、完整代码实验室
import cv2
import numpy as np
def blob_detection(img_path):
# 1. 图像预处理
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0) # 高斯模糊去噪
# 2. 动态阈值分割(适应不同光照)_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 3. 轮廓检测
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 4. 特征计算与过滤
for cnt in contours:
area = cv2.contourArea(cnt)
if area < 100: continue # 忽略小噪点
perimeter = cv2.arcLength(cnt, True)
circularity = 4*np.pi*area/(perimeter**2)
# 绘制结果
cv2.drawContours(img, [cnt], -1, (0,255,0), 2)
cv2.imshow('Result', img)
cv2.waitKey(0)
# 使用示例
blob_detection('coins.jpg')
四、调参避坑手册
-
阈值选择陷阱
直接使用固定阈值(如thresh=127)在光照变化时会失效,优先选用THRESH_OTSU或自适应阈值。 -
噪声干扰
未做高斯模糊时,图像噪点会被误判为 Blob。典型处理流程:模糊 -> 二值化 -> 形态学操作(可选)。 -
轮廓层级混乱
嵌套物体需使用RETR_TREE参数,但初学者建议先用RETR_EXTERNAL避免复杂情况。
五、实战升级挑战
尝试改造代码实现『米粒计数』:
1. 调整面积阈值过滤碎屑
2. 用圆形度区分完整 / 破碎米粒
3. 添加计数结果显示在图像右上角
经验分享:工业检测中常配合
cv2.minEnclosingCircle()计算 Blob 最小外接圆,用于定位圆形零件。
六、性能优化方向
- 算法层面
- 大图先用
cv2.resize()缩小处理 -
使用
cv2.Canny()边缘检测替代全图二值化 -
硬件加速
OpenCV4.x 支持cv2.UMat()GPU 加速,对视频流处理效果显著。
遇到问题随时回看第二部分的流程图,大多数错误都能通过调整预处理步骤解决。下一步可以尝试结合 HSV 色彩空间做彩色 Blob 检测,解锁更多应用场景!
正文完
