易学智能

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7971|回复: 0

[opencv] openCV【实践系列】4——使用Opencv进行斑点(blob)检测

[复制链接]

27

主题

37

帖子

116

积分

论坛管理

Rank: 4

积分
116
发表于 2018-10-10 11:20:24 | 显示全部楼层 |阅读模式
本帖最后由 fantomas 于 2018-10-19 10:19 编辑

使用Opencv进行斑点(blob)检测

本教程阐述了使用opencv进行简单的斑点检测
  • 什么是斑点?
斑点是图像中的一组连接像素,它们共享一些共同属性(例如灰度值)。在下图中,暗连通区域是斑点,斑点检测的目标是识别和标记这些区域。
图片1.png
简单的斑点检测器示例
opencv提供了一种检测斑点的便捷方法,并根据不同的特征对其进行过滤。让我们从最简单的例子开始:
Python:
  1. import cv2
  2. import numpy as np
  3. #读图片
  4. im = cv2.imread('blod.jpg', cv2.IMREAD_GRAYSCALE)
  5. #创建一个检测器并使用默认参数
  6. detector = cv2.SimpleBlobDetector()
  7. #检测斑点
  8. keypoints = detector.detect(im)
  9. #将检测到的斑点圈上红色的圆圈
  10. #DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS保证圆的大小和斑点大小一样
  11. im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255),
  12.                                      cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
  13. #显示检测到的点
  14. cv2.imshow('keypoints', im_with_keypoints)
  15. cv2.waitKey(0)
复制代码

以下是得到的检测结果左图是原图,右图是结果图:
图片3.png
  • 斑点检测器是如何工作呢?
顾名思义,SimpleBlobDetector是一种简单的算法,该算法由检测器的参数控制,并由以下几步组成:
        1. 阈值处理 通过使用从minThreshold开始的阈值对源图像进行阈值处理,将源图像转换成多个二进制图像。这些阈值以thresholdStep大小依次递增直到maxThreshold,所以第一个阈值是minThreshold,第二个是minThreshold+thresholdStep,第三个是minThreshold+2*thresholdStep,依此类推。
        2. 分组:在每个二进制图像中,连接白色像素被分成一组,我们称为二进制斑点
        3. 合并: 计算二进制图像中二进制斑点的重心,并合并更靠近minDistBetweenBlobs的斑点
        4. 中心和半径计算:计算并返回新合并的斑点的中心点和半径值
按颜色,大小和形状来过滤斑点
可以设置SimpleBlobDetector的参数来过滤我们想要的斑点类型:
        1. 按颜色:(注意:此功能已经损坏,我检查了代码,它似乎有一个逻辑错误)首先你需要设置filterByColor=1,设置blobColor=0选择颜色更暗的斑点,blobColor=255选择颜色更浅的斑点
        2. 按大小:你可以通过设置参数filterByArea=1以及minAreamaxArea的适当值来根据大小过滤斑点,例如,设置minArea=100将过滤掉所有小于100像素的斑点
        3. 按形状:现在形状有三种不同的参数
              3.1 圆度:这只是测量斑点的圆形接近程度,例如正六边形具有比正方形更高的圆度,要按照圆度过滤,请设置filterByCircularity=1然后为minCircularitymaxCircularity设置适当的值。
              3.2 凸度:一张图片胜过千言万语,凸度定义为它的凸起区域或者凸包的面积。现在,形状的凸形船体是完全包围形状的最紧密的凸性。由凸形过滤,设置filterByConvexity=1,然后设置0<= minConvexity<=1 maxConvexity<=1

图片4.png
                 3.3 惯性比:不要让这吓到你。数学家经常使用令人困惑的词来形容非常简单的东西。所以你必须知道的是,这可以测量形状的长度。例如,对于一个圆该值是1,对于椭圆它是01之间,而对于线0。为了通过惯量比过滤,设定filterByInertia = 1,并设置0≤  minInertiaRatio <=1maxInertiaRatio<=1
图片5.png
如何设置SimpleBlobDetector参数
设置SimpleBlobDetector参数,接下来给大家举一个例子
Python:
  1. #设置SimpleBlodDetector参数
  2. params = cv2.SimpleBlobDetector_Params()
  3. #改变阈值
  4. params.minThreshold = 10
  5. params.maxThreshold = 200
  6. #通过面积滤波
  7. params.filterByArea = True
  8. params.minArea = 1500
  9. #通过圆度滤波
  10. params.filterByCircularity = True
  11. params.minCircularity = 0.1
  12. #通过凸度滤波
  13. params.filterByConvexity = True
  14. params.minConvexity = 0.87
  15. #通过惯性比滤波
  16. params.filterByInertia = True
  17. params.minInertiaRatio = 0.01
  18. #创建一个检测器并使用默认参数
  19. ver = (cv2.version).split(',')
  20. if int(ver[0]) < 3:
  21.     detector = cv2.SimpleBlobDetector(params)
  22. else:
  23.     detector = cv2.SimpleBlobDetector_create(params)
  24.    
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|易学智能

GMT+8, 2024-12-22 13:51 , Processed in 0.024537 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表