在python中设置blob检测参数

时间:2016-04-20 13:15:48

标签: python opencv feature-detection

我正在使用OpenCV 2.4.9在圆形物体的相机图像上运行斑点检测。我在图像上运行了许多标准滤镜(模糊,自适应阈值,使用skimage例程的骨架化和骨架的扩张),并且想要在结果上识别斑点(连续的黑色区域)。有一个SimpleBlobDetector只是为了这个,但是我设置了它的参数,它没有做我想做的事。

这是原始图片: caputred image

这是处理过的版本,检测器的关键点以黄色绘制: skeletonization

关键点似乎不尊重区域限制,也不会出现在我期望的位置。

脚本如下所示,是否有明显的错误?还是其他任何建议?

import numpy as np
import cv2
import skimage, skimage.morphology

img0=cv2.imread('capture_b_07.cropped.png')
img1=cv2.cvtColor(img0,cv2.COLOR_BGR2GRAY)
img2=cv2.medianBlur(img1,5)
img3=cv2.bilateralFilter(img2,9,75,75)
img4=cv2.adaptiveThreshold(img3,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,21,0)
img5=skimage.img_as_ubyte(skimage.morphology.skeletonize(skimage.img_as_bool(img4)))
img6=cv2.dilate(img5,cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)),iterations=1)
# blob detection
pp=cv2.SimpleBlobDetector_Params()
pp.filterByColor=True
pp.blobColor=0
pp.filterByArea=True
pp.minArea=500
pp.maxArea=5000
pp.filterByCircularity=True
pp.minCircularity=.4
pp.maxCircularity=1.

det=cv2.SimpleBlobDetector(pp)
keypts=det.detect(img6)
img7=cv2.drawKeypoints(img6,keypts,np.array([]),(0,255,255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imwrite('capture_b_07.blobs.png',img7)

来自ImageJ(Analyze Particles,圆度0.5-1.0,面积500-5000 px ^ 2)的类似管道,我试图使用OpenCV重现,它给出了这样的结果:

imagej blobs

1 个答案:

答案 0 :(得分:1)

您可以使用分水岭获得与ImageJ类似的结果。 我将img6倒置,标记了它,然后将其用作opencv watershed的标记。然后,我使用形态滤波器放大了分水岭分割边界线,并使用opencv findContours找到了连通分量。以下是结果。不确定这是不是你想要的。我没有发布代码,因为我快速尝试使用pythonc++的组合,所以它有点乱。

分水岭细分

ws

已连接的组件 cc