在Python中检测白色背景上的物体

E. *_* B. 5 python algorithm image mahotas

我正在尝试使用 Python 来检测白色表面上有多少个物体。示例图像位于本文末尾。

我想知道应该如何做到这一点,主要是因为背景是白色的,并且大多数时候它被检测为前景。

我现在在Python中基于本教程(http://pythonvision.org/basic-tutorial)使用了多个库并检测白色作为对象,因此计数为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()
Run Code Online (Sandbox Code Playgroud)

是否有任何选项可以将白色部分作为背景并将工具作为前景?

提前致谢!

示例图片: 在此输入图像描述

分割后的图像,其中红色为前景,蓝色为背景(少数工具合并不是问题):

在此输入图像描述

Ada*_*hes 5

如果阴影不是问题的话

您可以在给定此二进制图像的 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 阈值返回一个值:像素亮度,而您所做的就是保留比该阈值暗的所有像素。这种方法会被阴影绊倒,因此您需要尝试另一种分割算法,最好是进行局部分割的算法(即它单独分割图像的小区域。)

自适应或本地方法不存在此问题,并且非常适合图像的阴影:

http://scikit-image.org/docs/dev/auto_examples/plot_threshold_adaptive.html#example-plot-threshold-adaptive-py

在 mahotas 中应该有其他分割方法,但我只了解 scikit-image 。如果您想认真了解细分,请查看本文: https: //peerj.com/preprints/671/

完全公开,这是我的论文。