我正在尝试使用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检测后成功获取关键点。
答案 0 :(得分:2)
如果您只想检测白色矩形,可以尝试设置更高的阈值,例如253,用开口擦除小物体并取最大的斑点。我首先使你的图像平滑,然后对其进行阈值处理:
和开幕式:
现在您只需使用findContours
并使用boundingRect
。如果您的矩形始终是白色,它应该工作。如果你的阈值低于251,那么其他小斑点将出现,你的区域将与它们合并,如下所示:
但我不认为这是最快的想法;)
答案 1 :(得分:1)
您可以尝试将params.maxArea设置为令人讨厌的大(某些数万个):默认值可能低于您尝试检测的矩形区域。此外,我不知道这是否真实,但我听说过颜色检测会出现逻辑错误,因此,如果引起问题,可能值得尝试禁用它(这可能已在以后的版本中修复,但它仍然值得一试)