在 Python 中检测白色背景上的对象
Detect objects on a white background in Python
我正在尝试使用 Python 检测白色表面上有多少对象。在此 post.
末尾找到示例图片
我想知道我应该怎么做,主要是因为背景是白色的,而且大多数时候它被检测为前景。
我现在在 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()
是否有将白色部分作为背景并将工具作为前景的选项?
提前致谢!
示例图片:
红前景蓝背景的分割图(几个工具合并没问题):
如果阴影不是问题
您可以在 mahotas 中标记图像 (http://mahotas.readthedocs.org/en/latest/labeled.html) given this binary image. You can also use skimage.morphology (which uses ndlabel as was mentioned in comments). http://scikit-image.org/docs/dev/auto_examples/plot_label.html
这些是连接组件算法的示例,并且是任何通用图像处理包中的标准。 ImageJ 也使这变得非常简单。
如果阴影有问题
Otsu 阈值化 returns 单个值:像素亮度,您所做的就是保留所有比该阈值暗的像素。这种方法被你的阴影绊倒了,所以你需要尝试另一种分割算法,最好是进行局部分割的算法(即单独分割图像的小区域。)
自适应或局部方法没有这个问题,并且非常适合您图像的阴影:
在mahotas中应该还有其他分割方法,但我只了解scikit-image。如果您想认真了解分割,请查看这篇论文:https://peerj.com/preprints/671/
完全公开,这是我的论文。
我正在尝试使用 Python 检测白色表面上有多少对象。在此 post.
末尾找到示例图片我想知道我应该怎么做,主要是因为背景是白色的,而且大多数时候它被检测为前景。
我现在在 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()
是否有将白色部分作为背景并将工具作为前景的选项?
提前致谢!
示例图片:
红前景蓝背景的分割图(几个工具合并没问题):
如果阴影不是问题
您可以在 mahotas 中标记图像 (http://mahotas.readthedocs.org/en/latest/labeled.html) given this binary image. You can also use skimage.morphology (which uses ndlabel as was mentioned in comments). http://scikit-image.org/docs/dev/auto_examples/plot_label.html
这些是连接组件算法的示例,并且是任何通用图像处理包中的标准。 ImageJ 也使这变得非常简单。
如果阴影有问题
Otsu 阈值化 returns 单个值:像素亮度,您所做的就是保留所有比该阈值暗的像素。这种方法被你的阴影绊倒了,所以你需要尝试另一种分割算法,最好是进行局部分割的算法(即单独分割图像的小区域。)
自适应或局部方法没有这个问题,并且非常适合您图像的阴影:
在mahotas中应该还有其他分割方法,但我只了解scikit-image。如果您想认真了解分割,请查看这篇论文:https://peerj.com/preprints/671/
完全公开,这是我的论文。