使用OpenCV进行Blob检测

时间:2016-09-12 19:15:10

标签: python opencv

我正在尝试使用OpenCV进行一些白色斑点检测。但我的脚本未能检测到大白块,这是我的目标,同时检测到一些小斑点。我是OpenCV的新手,在OpenCV中使用simpleblobdetection时我做错了什么? [部分解决,请在下面阅读]

以下是剧本:

#!/usr/bin/python

# Standard imports
import cv2
import numpy as np;

from matplotlib import pyplot as plt

# Read image
im = cv2.imread('whiteborder.jpg', cv2.IMREAD_GRAYSCALE)
imfiltered = cv2.inRange(im,255,255)

#OPENING
kernel = np.ones((5,5))

opening = cv2.morphologyEx(imfiltered,cv2.MORPH_OPEN,kernel)

#write out the filtered image

cv2.imwrite('colorfiltered.jpg',opening)


# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()

params.blobColor= 255
params.filterByColor = True


# Create a detector with the parameters
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
    detector = cv2.SimpleBlobDetector(params)
else : 
    detector = cv2.SimpleBlobDetector_create(params)


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

# Draw detected blobs as green circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures
# the size of the circle corresponds to the size of blob

print str(keypoints)

im_with_keypoints = cv2.drawKeypoints(opening, keypoints, np.array([]), (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show blobs
##cv2.imshow("Keypoints", im_with_keypoints)

cv2.imwrite('Keypoints.jpg',im_with_keypoints)

cv2.waitKey(0)

修改

通过添加更大的区域最大值,我能够识别出一个大blob但我的最终目标是识别是否存在大的白色矩形。我做的白色斑点检测不仅返回矩形,还返回周围区域。 [这部分解决了]

编辑2:

根据@PSchn的答案,我更新我的代码以应用逻辑,首先将滤镜设置为仅获取白色像素,然后使用开口移除噪点。它适用于样本数据,我可以在blob检测后成功获取关键点。 enter image description here

2 个答案:

答案 0 :(得分:2)

如果您只想检测白色矩形,可以尝试设置更高的阈值,例如253,用开口擦除小物体并取最大的斑点。我首先使你的图像平滑,然后对其进行阈值处理:

enter image description here

和开幕式:

enter image description here

现在您只需使用findContours并使用boundingRect。如果您的矩形始终是白色,它应该工作。如果你的阈值低于251,那么其他小斑点将出现,你的区域将与它们合并,如下所示:

enter image description here

然后你仍然可以开几次,你得到这个: enter image description here

但我不认为这是最快的想法;)

答案 1 :(得分:1)

您可以尝试将params.maxArea设置为令人讨厌的大(某些数万个):默认值可能低于您尝试检测的矩形区域。此外,我不知道这是否真实,但我听说过颜色检测会出现逻辑错误,因此,如果引起问题,可能值得尝试禁用它(这可能已在以后的版本中修复,但它仍然值得一试)