[opencv-python] Opencv学习之Blob分析

概述

Blob即图像中一组具有某些共同属性(如,灰度值)的连接像素。使用Blob检测可以快速从灰度图像中定位跟提取各种常见的几何形状。Opencv提供了根据面积、灰度值、圆度、凸度、惯量进行过滤得到符合需求的各种Blob形状,实现检测的定位与检测。

1.设置Blob检测器参数

# Setup SimpleBlobDetector parameters
 params = cv2.SimpleBlobDetector_Params()

Blob对象检测算法,支持一下五种过滤方式:

 

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

2.实例程序(含注释)

# Standard imports
import cv2
import numpy as np

# Read image
im = cv2.imread("blob.jpg", cv2.IMREAD_GRAYSCALE)

# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()

# Change thresholds 
params.minThreshold = 10 #自定义下阈值
params.maxThreshold = 200 #自定义上阈值

# Filter by Area.
params.filterByArea = True
params.minArea = 1500 #自定义最小面积(即检测大于此面积的斑点)

# Filter by Circularity 根据圆度过滤(圆的圆度为1,正方形的圆度为0.785,不熟悉圆度的以此为参考):
params.filterByCircularity = False
params.minCircularity = 0.1 #自定义最小圆度

# Filter by Convexity 根据凹凸性过滤(凹凸性=Blob面积/凸包面积):
params.filterByConvexity = False
params.minConvexity = 0.87 #自定义最小凹凸性
    
# Filter by Inertia 根据惯性比过滤(0<=惯性比<=1):
params.filterByInertia = False
params.minInertiaRatio = 0.01 自定义最小惯性比

# Filter by Color 根据颜色过滤
params.filterByColor=True
params.blobColor=0 #选择较暗斑点
params.blobColor=255 #选择较亮斑点

# Create a detector with the parameters
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
	detector = cv2.SimpleBlobDetector(params)
else : 
	detector = cv2.SimpleBlobDetector_create(params)


# Detect blobs.
keypoints = detector.detect(im)

# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures
# the size of the circle corresponds to the size of blob

im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show blobs
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

图片

3.Blob参数设置(原理简介)

在OpenCV中实现的叫做SimpleBlobDetector,它基于以下描述的相当简单的算法,并且进一步由参数控制,具有以下步骤。

thresholdStep = 10 #二值化的阈值步长      
minThreshold = 50 #二值化的起始阈值   
maxThreshold = 200 #二值化的终止阈值       
         
#重复的最小次数,只有属于灰度图像斑点的那些二值图像斑点数量大于该值时,该灰度图像斑点才被认为是特征点
      
minRepeatability =2
     
#最小的斑点距离,不同二值图像的斑点间距离小于该值时,被认为是同一个位置的斑点,否则是不同位置上的斑点
      
minDistBetweenBlobs = 10 

filterByColor = True #斑点颜色的限制变量
blobColor = 0 #表示只提取黑色斑点;如果该变量为255,表示只提取白色斑点
    
filterByArea  = True #斑点面积的限制变量
minArea = 25 #斑点的最小面积
maxArea = 5000 #斑点的最大面积

filterByCircularity  = True #斑点圆度的限制变量,默认是不限制
minCircularity =0.8 #斑点的最小圆度
     
filterByInertia = True #斑点惯性率的限制变量
minInertiaRatio =0.1 #斑点的最小惯性率
    
filterByConvexity = True #斑点凸度的限制变量
minConvexity =0.95 #斑点的最小凸度

阈值:通过使用以minThreshold开始的阈值对源图像进行阈值处理,将源图像转换为多个二进制图像。这些阈值以thresholdStep递增,直到maxThreshold。因此,第一个阈值为minThreshold,第二个阈值为minThreshold + thresholdStep,第三个阈值为minThreshold + 2 x thresholdStep,依此类推;
分组:在每个二进制图像中,连接的白色像素被分组在一起。我们称这些二进制blob;
合并:计算二进制图像中二进制斑点的中心,并合并比minDistBetweenBlob更近的斑点;
中心和半径计算:计算并返回新合并的Blob的中心和半径。

并且可以进一步设置SimpleBlobDetector的参数来过滤所需的Blob类型。

按颜色:首先需要设置filterByColor =True。设置blobColor = 0 可选择较暗的blob,blobColor = 255 可以选择较浅的blob。

按面积:可以通过设置参数filterByArea = 1以及minArea和maxArea的适当值来基于大小过滤blob。例如。设置minArea = 100将滤除所有少于100个像素的斑点。

按圆度:这只是测量斑点距圆的距离。例如。正六边形的圆度比正方形高。要按圆度过滤,请设置filterByCircularity =1。然后为minCircularity和maxCircularity设置适当的值。圆度定义为(

Afa=\frac{4*PI*S}{C*C} )。圆的为圆度为1,正方形的圆度为PI/4,依此类推。

circle:Afa=\frac{4*PI*S}{C*C}=\frac{4*PI*PI*R*R}{2*PI*R*2*PI*R}=1

square:Afa=\frac{4*PI*S}{C*C}=\frac{4*PI*A*A}{4*A*4*A}=\frac{PI}{4}\approx 0.785


按凸性:凸度定义为(斑点的面积/凸包的面积)。现在,形状的“凸包”是最紧密的凸形,它完全包围了该形状,用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。直观感受上,凸性越高则里面“奇怪的部分”越少。要按凸度过滤,需设置filterByConvexity = true,minConvexity、maxConvexity应该属于[0,1],而且maxConvexity> minConvexity。

按惯性比:这个词汇比较抽象。我们需要知道Ratio可以衡量形状的伸长程度。简单来说。对于圆,此值是1,对于椭圆,它在0到1之间,对于直线,它是0。按惯性比过滤,设置filterByInertia = true,并设置minInertiaRatio、maxInertiaRatio同样属于[0,1]并且maxConvexity> minConvexity。
按凸性(左低右高)按惯性比(左低右高)​ ​​​

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值