首先,现在我正在使用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检测?有人能告诉我差异或正确的代码吗?
谢谢!
此致 南
答案 0 :(得分:4)
看起来blob检测器默认启用了filterByInertia
和filterByConvexity
个参数。
您可以在系统中查看:
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
你最终会得到:
答案 1 :(得分:2)
答案 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:
示例2: