我试图用Python来检测白色表面上有多少个物体。本文末尾有一个示例图片。
我想知道我应该怎么做,主要是因为背景是白色的,而且大部分时间它被检测为前景。
我现在在Python中基于本教程(http://pythonvision.org/basic-tutorial)使用了几个库,并将白色检测为对象,因此count为1,工具被检测为背景,因此被忽略:
dna = mahotas.imread('dna.jpeg')
dna = dna.squeeze()
dna = pymorph.to_gray(dna)
print dna.shape
print dna.dtype
print dna.max()
print dna.min()
dnaf = ndimage.gaussian_filter(dna, 8)
T = mahotas.thresholding.otsu(dnaf)
labeled, nr_objects = ndimage.label(dnaf > T)
print nr_objects
pylab.imshow(labeled)
pylab.jet()
pylab.show()
有没有选项可以将白色部分作为背景,将工具作为前景?
提前致谢!
示例图片:
分段图像,其中红色是前景和蓝色背景(合并的几个工具不是问题):
答案 0 :(得分:4)
您可以使用此二进制图像在mahotas(http://mahotas.readthedocs.org/en/latest/labeled.html)中标记图像。您还可以使用skimage.morphology(使用评论中提到的ndlabel)。 http://scikit-image.org/docs/dev/auto_examples/plot_label.html
这些是连接组件算法的示例,并且是任何通用图像处理包中的标准。 ImageJ也让这很简单。
Otsu阈值返回单个值:像素亮度,您所做的就是保持所有像素都比此阈值更暗。这种方法会被你的阴影绊倒,所以你需要尝试另一种分割算法,最好是一种进行局部分割的算法(IE可以单独分割图像的小区域。)
自适应或本地方法没有这个问题,并且非常适合图像的阴影:
在mahotas中应该有其他分割方法,但我只对scikit-image有所了解。如果您想要对分段进行认真的概述,请查看此论文:https://peerj.com/preprints/671/
完全披露,这是我的论文。