为什么我不能对这个二进制图像进行斑点检测

时间:2016-08-22 15:25:33

标签: python opencv image-processing binary blob

首先,现在我正在使用Opencv对Python2.7进行blob检测。我想要做的是在颜色检测后完成斑点检测。我想检测红色圆圈(标记),并避免其他blob干扰,我想先做颜色检测,然后进行斑点检测。

,颜色检测后的图像为binary mask

现在我想对这张图片进行斑点检测,但它不起作用。 这是我的代码。

import cv2
import numpy as np;

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

# Set up the detector with default parameters.

params = cv2.SimpleBlobDetector_Params()
# Change thresholds
params.minThreshold = 10;    # the graylevel of images
params.maxThreshold = 200;

params.filterByColor = True
params.blobColor = 255

# Filter by Area
params.filterByArea = False
params.minArea = 10000

detector = cv2.SimpleBlobDetector(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 keypoints
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)`

我对此代码感到困惑,因为它适用于此图像white dots 我认为白点图像与二进制掩码相似,但是为什么我不能对二进制图像进行blob检测?有人能告诉我差异或正确的代码吗?

谢谢!

此致 南

3 个答案:

答案 0 :(得分:4)

看起来blob检测器默认启用了filterByInertiafilterByConvexity个参数。 您可以在系统中查看:

import cv2
params = cv2.SimpleBlobDetector_Params()
print params.filterByColor
print params.filterByArea
print params.filterByCircularity
print params.filterByInertia
print params.filterByConvexity

因此,当您致电detector = cv2.SimpleBlobDetector(params)时,您实际上也会通​​过惯性和凸性过滤默认的最小值和最大值。

如果您明确禁用了这些过滤条件:

# Disable unwanted filter criteria params
params.filterByInertia = False
params.filterByConvexity = False

...然后拨打detector = cv2.SimpleBlobDetector(params),您会看到以下图片: the docs

该图像中的第三个斑点是由图像右下方的白框引起的。 如果框架始终位于同一位置,您可以裁剪图像,或者可以使用参数按圆度过滤并删除不需要的blob:

params.filterByCircularity = True
params.minCircularity = 0.1

你最终会得到:

blobing result

答案 1 :(得分:2)

它是按颜色过滤的opencv错误。您需要做的就是反转图像的颜色 - >检测Blob - >再次反转以恢复原始颜色

代码

querty

输出

enter image description here

答案 2 :(得分:0)

最简单的方式就是@ArjitMukherjee所说的。

但我也回应@meetaig最初评论的两个图像中斑点结构的差异

  

为什么它可能不起作用的线索可能是blob的结构。   在第一张图像中,白色像素并非都连接到大像素   blob(意思是有一些单个像素"漂浮在")而   在第二张图片中,圆圈是完美的斑点

您需要对算法进行微调,使其适合/与不同的blob结构对齐

我做了很快的微调,可以部分满足你的要求:

import cv2
import numpy as np;

# Read image
im = cv2.imread("eRCe1.png", cv2.IMREAD_GRAYSCALE)
# Set up the detector with default parameters.

params = cv2.SimpleBlobDetector_Params()
# Change thresholds
params.minThreshold = 10;    # the graylevel of images
params.maxThreshold = 200;

params.filterByColor = True
params.blobColor = 255

# Filter by Area
params.filterByArea = True
params.minArea = 300

detector = cv2.SimpleBlobDetector(params)

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

print keypoints
# 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)


cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

在您提供的相同图像上执行上述代码,下面是输出

示例1:

sample #1

示例2:

sample #2