美文网首页
斑点(blob)检测

斑点(blob)检测

作者: 大龙10 | 来源:发表于2023-01-07 06:32 被阅读0次

    一、什么是斑点?

    • 斑点是图像中的一组连接像素,它们共享一些共同属性(例如灰度值)。

      在下图中,暗连通区域是斑点,斑点检测的目标是识别和标记这些区域。


    二、简单的斑点检测器示例

    • opencv提供了一种检测斑点的便捷方法,并根据不同的特征对其进行过滤。
    import cv2
    import numpy as np
    #读图片
    im = cv2.imread('blod.jpg', cv2.IMREAD_GRAYSCALE)
    #创建一个检测器并使用默认参数
    detector = cv2.SimpleBlobDetector()
    #检测斑点
    keypoints = detector.detect(im)
    #将检测到的斑点圈上红色的圆圈
    #DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS保证圆的大小和斑点大小一样
    im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255),
                                         cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    #显示检测到的点
    cv2.imshow('keypoints', im_with_keypoints)
    cv2.waitKey(0)
    

    三、斑点检测器是如何工作呢?

      顾名思义,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以及minArea和maxArea的适当值来根据大小过滤斑点,
      例如,设置minArea=100将过滤掉所有小于100像素的斑点

    3. 按形状:

    现在形状有三种不同的参数

    • 3.1 圆度:
      这只是测量斑点的圆形接近程度,例如正六边形具有比正方形更高的圆度,要按照圆度过滤,请设置filterByCircularity=1然后为minCircularity和maxCircularity设置适当的值。

    • 3.2 凸度:
      一张图片胜过千言万语,凸度定义为它的凸起区域或者凸包的面积。现在,形状的凸形船体是完全包围形状的最紧密的凸性。由凸形过滤,设置filterByConvexity=1,然后设置0<= minConvexity<=1 和 maxConvexity<=1


    • 3.3 惯性比:
      不要让这吓到你。数学家经常使用令人困惑的词来形容非常简单的东西。所以你必须知道的是,这可以测量形状的长度。
      例如,对于一个圆该值是1,对于椭圆它是0和1之间,而对于线段为0。
      为了通过惯量比过滤,设定filterByInertia = 1,并设置0≤ minInertiaRatio <=1和maxInertiaRatio<=1。


    五、如何设置SimpleBlobDetector参数

    • 设置SimpleBlobDetector参数,接下来举一个例子
    #设置SimpleBlodDetector参数
    params = cv2.SimpleBlobDetector_Params()
    #改变阈值
    params.minThreshold = 10
    params.maxThreshold = 200
    #通过面积滤波
    params.filterByArea = True
    params.minArea = 1500
    #通过圆度滤波
    params.filterByCircularity = True
    params.minCircularity = 0.1
    #通过凸度滤波
    params.filterByConvexity = True
    params.minConvexity = 0.87
    #通过惯性比滤波
    params.filterByInertia = True
    params.minInertiaRatio = 0.01
    #创建一个检测器并使用默认参数
    ver = (cv2.version).split(',')
    if int(ver[0]) < 3:
        detector = cv2.SimpleBlobDetector(params)
    else:
        detector = cv2.SimpleBlobDetector_create(params)
    

    六、资料来源

    码农家园:https://www.codenong.com/cs106018683/
    

    相关文章

      网友评论

          本文标题:斑点(blob)检测

          本文链接:https://www.haomeiwen.com/subject/pudscdtx.html