使用 OpenCV 进行斑点检测

Posted

技术标签:

【中文标题】使用 OpenCV 进行斑点检测【英文标题】:Blob detection using OpenCV 【发布时间】:2016-09-12 19:15:10 【问题描述】:

我正在尝试使用 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)

编辑

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

编辑 2:

根据@PSchn 的回答,我更新了我的代码以应用逻辑,首先将滤色器设置为仅获取白色像素,然后使用开口去除噪声点。它适用于样本数据,我可以在斑点检测后成功获得关键点。

【问题讨论】:

【参考方案1】:

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

还有开场:

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

然后你仍然可以打开几次,你会得到:

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

【讨论】:

很棒的解释。这就是我正在寻找的。欣赏! 不客气。但我不知道它是否适用于您的所有图像。希望是的;) 您介意分享您如何进行平滑和其他步骤的代码吗?另外,调整参数以获得此类任务的最佳过滤器的最佳方法是什么?再次感谢! 我现在没有代码,我用 ImageJ 匆忙做了。但如果你愿意,我可以为每个步骤添加一些代码。最好的过滤器是什么意思?平滑过滤器? 那太好了!是的,你是怎么想出 253 对这个图像的阈值有好处的,你是怎么做平滑滤波器的?我不确定如何适当地设置参数,以便我可以将逻辑应用于我自动拥有的其他图像(它们可能不同,而且很多)【参考方案2】:

您可以尝试将 params.maxArea 设置为令人讨厌的大值(数以万计):默认值可能低于您尝试检测的矩形区域。另外,我不知道这是否真实,但我听说通过颜色检测存在逻辑错误,因此可能值得尝试禁用它以防万一导致问题(这可能已在后续版本中修复,但仍值得一试)

【讨论】:

通过为过滤器设置更大的 maxArea 参数,我可以检测到大斑点。感谢您的回答。但是我遇到了另一个问题,即我只想识别具有相同颜色值且彼此相邻的像素点(不被其他值中的其他像素分隔)。就像我之前发布的示例一样,我尝试识别大的白色矩形块,我得到的是矩形的巨大斑点及其大量的白色像素。

以上是关于使用 OpenCV 进行斑点检测的主要内容,如果未能解决你的问题,请参考以下文章

浅析OpenCV中的BlobDetector

OpenCV blob(斑点)特征,SimpleBlobDetector

OpenCV中的斑点提取

OpenCV - 在二进制图像中找到最大斑点的边界框

Playing with OpenCV

Playing with OpenCV