【问题标题】:OpenCV blob detection not discriminating between well defined blobsOpenCV blob 检测不区分明确定义的 blob
【发布时间】:2017-05-18 23:14:42
【问题描述】:

我正在尝试检测某些图像中定义明确的斑点,我可以轻松地将图像阈值设置为仅具有我想要检测的白点,但斑点检测器似乎将其中一些组合在一起或错过了其他斑点。有一个更好的方法吗?有什么方法可以找到每个连接的白色像素岛,而且速度不是很慢吗?

阈值图像:

检测到的斑点:

用于将阈值处理成 blob 的代码:

import numpy as np
import cv2

params = cv2.SimpleBlobDetector_Params()
# we are looking for white blobs in a mask
params.blobColor = 255
params.filterByColor = True
params.filterByArea = True
params.minArea = 0
# Blobs larger than 50 pixels are noise
params.maxArea = 50
# enabling these can cause us to miss points
params.filterByCircularity = False
params.filterByConvexity = False
params.filterByInertia = False
detector = cv2.SimpleBlobDetector_create(params)

img = cv2.imread('Threshold Out.png', flags=cv2.IMREAD_GRAYSCALE)

keypoints = detector.detect(img)

img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
img = cv2.drawKeypoints(img, keypoints, np.array([]), (0, 0, 255),
                        cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

while True:
    cv2.imshow('out', img)
    key = cv2.waitKey(0)
    if key == 27:
        break

【问题讨论】:

  • 要调试它,我会在cvtColor() 之后再次尝试阈值化或计算颜色,以确保所有像素确实为 0 或 255。
  • @MarkSetchell 您会注意到我在将检测器转换为 RGB 之前应用了检测器,以避免此类问题
  • 哎呀,是的。也许早点检查一行,以防阅读已经完成。
  • 我实际上遇到了你描述的问题,在这之前我发现了 cv2.IMREAD_GRAYSCALE 标志
  • 我不会说 Python,但在 imread 中应该说 flags= 吗?

标签: python-2.7 opencv


【解决方案1】:

阅读C docs for the blob detector params 后,有一个名为minDistBetweenBlobs 的参数并将其设置为1 解决了我的问题。

检测到的斑点:

更新代码:

import numpy as np
import cv2

params = cv2.SimpleBlobDetector_Params()
# we are looking for white blobs in a mask
params.blobColor = 255
params.filterByColor = True
params.filterByArea = True
params.minDistBetweenBlobs = 1
params.minArea = 0
# Blobs larger than 50 pixels are noise
params.maxArea = 50
# enabling these can cause us to miss points
params.filterByCircularity = False
params.filterByConvexity = False
params.filterByInertia = False
detector = cv2.SimpleBlobDetector_create(params)

img = cv2.imread('Threshold Out.png', flags=cv2.IMREAD_GRAYSCALE)

keypoints = detector.detect(img)

img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
img = cv2.drawKeypoints(img, keypoints, np.array([]), (0, 0, 255),
                        cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

while True:
    cv2.imshow('out', img)
    key = cv2.waitKey(0)
    if key == 27:
        break

【讨论】:

  • 干得好,感谢您与社区分享。
猜你喜欢
  • 2019-11-21
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多