ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

opencv-blob

2022-01-17 19:03:14  阅读:163  来源: 互联网

标签:阈值 斑点 cv2 opencv params blob 设置 参数


1.什么是Blob?

       像素是图像中的一组连接像素,它们共享一些公共属性(例如灰度值)。在上面的图像中,暗连接区域是斑点,而斑点检测的目标是识别和标记这些区域。这个算法说白了就是检测图像的斑点,“一坨一坨”的异于周围背景的东西,代表的是一些“不同”的区域。

2. Blob检测是如何实现的?

      simpleblobdetector,顾名思义,就像下面描述的那样,是一个非常简单的算法。该算法由一些参数控制(如下所示),并具有以下步骤。从上往下来了解参数是如何设置的。

1.Thresholding :

      首先进行阈值分割。从设置的最小阈值minthreshold参数开始将源图分割为几个二值图。这些阈值是通过设置的步长thresholdStep 逐渐递增的,知道达到设置好的最大阈值maxThreshold参数。所以第一个阈值是minthreshold,第二个阈值是minthreshold+thresholdStep ,第三个阈值是minthreshold+2×thresholdStep ,以此类推。

2.Grouping:

      在每个二值图像中,连接的白像素被分组在一起。让我们调用这些斑点。

3.Merging  :

       合并。计算这些二值图中的斑点的中心,并且将相互之间距离小于设置的minDistBetweenBlobs 的斑点合并成一个。

4.Center & Radius Calculation:

      中心和半径的计算。计算这些合并后的斑点的中心和半径,并返回。

3.通过颜色,大小和形状过滤这些斑点

可以通过设置SimpleBlobDetector 函数的参数对斑点进行过滤,来获得我们所需要的斑点。

  • 通过颜色:【这个功能可能有点问题(当然博主不是很清楚这个问题,没试过),作者检查了这个代码,发现他有逻辑上的问题(也不知道他用的什么版本的opencv,是不是真有这个问题,官方是否已经对此进行了优化,知道的小伙伴可以告诉我)】。首先,需要设置filterByColor = 1,设置blobColor = 0来选择暗淡区域(应该就是黑色)的斑点,或者是blobColor = 255(来选择亮区域应该就是白色)的斑点。
  • 通过大小:可以通过将参数filterByArea =1,并且给minArea和maxArea设置恰当的参数。比如:将minArea=100,这样会将所有斑点里像素小于100的过滤掉。
  • 通过形状:现在形状有三种参数:
  1. 圆(Circularity ) :这个仅仅衡量斑点和圆有多相似。比如:正六边形比正方形有更高的圆度。通过类圆性来过滤,可以设置filterByCircularity = 1,然后给minCircularity 和maxCircularity设置恰当的参数。类圆性定义如下:也就是(4π×面积)/(周长的平方)。也就是说圆的类圆性是1,正方形的类圆性是0.785等等。
  2. 凸性(Convexity ):凸性的定义是(斑点的面积/斑点凸包的面积)。一个形状的凸包是严格凸的形状,并且完全封闭(这玩意在手势识别里还是蛮好用的,不懂得可以去了解下)。将filterByConvexity =1,接下来设置 0 ≤ minConvexity ≤ 1和maxConvexity ( ≤ 1) 。
  3. 惯量比(Inertia Ratio):不要被此吓倒(其实博主看的时候也不知道是啥)。数学经常使用一些迷惑性的语言去描述一些非常简单的东西。你所需要知道的是,这个测量了一个形状有多长。例如:对于一个圆,这个值是1,对于一个椭圆,它在0到1之间,对于一条直线,它是0。想要通过惯量比来过滤,需要设置filterByInertia =1, 0 ≤ minInertiaRatio ≤ 1,并且适当的设置参数maxInertiaRatio (≤ 1 )的值。

4.python代码实现

#!/usr/bin/python
 
# 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
params.filterByCircularity = True
params.minCircularity = 0.1
 
# Filter by Convexity
params.filterByConvexity = True
params.minConvexity = 0.87
    
# Filter by Inertia
params.filterByInertia = True
params.minInertiaRatio = 0.01
 
# 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)

效果图如下:

标签:阈值,斑点,cv2,opencv,params,blob,设置,参数
来源: https://blog.csdn.net/m0_55812384/article/details/122545888

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有