【问题标题】:Detect objects on a white background in Python在 Python 中检测白色背景上的对象
【发布时间】:2015-03-17 22:28:10
【问题描述】:

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

我想知道我应该怎么做,主要是因为背景是白色的,而且大多数时候它被检测为前景。

根据本教程 (http://pythonvision.org/basic-tutorial),我现在在 Python 中拥有的内容使用多个库并将白色检测为对象,因此计数为 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()

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

提前致谢!

示例图片:

红色为前景蓝色背景的分割图(少数工具合并不成问题):

【问题讨论】:

  • 你能把分割后的图片也发一下吗?
  • 使用分段图像编辑问题!
  • dnaf < T 应该反转得到的布尔矩阵
  • 您说的完全正确,完美运行!老实说,我不完全确定 > T 是什么意思,你能解释一下吗?
  • 它将数组(图像)的每个单元格与 T 进行比较。结果数组根据结果填充为 1 或 0。

标签: python image algorithm mahotas


【解决方案1】:

如果阴影不是问题

您可以在给定此二进制图像的情况下标记 mahotas (http://mahotas.readthedocs.org/en/latest/labeled.html) 中的图像。您还可以使用 skimage.morphology(它使用 cmets 中提到的 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/

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

【讨论】:

  • 很好的信息,即使阈值方法没有问题。 ndimage.label 使用连接组件算法我认为 +1
  • 谢谢,我更新了关于连接组件的答案,而不是仅仅关注阈值。我没有仔细阅读,看到他说阴影不是问题。
  • 我实际上正在自己写一篇关于 Python 图像处理的论文!您的信息将有很大帮助,非常感谢!
  • 太棒了,祝你好运!您应该查看 mahotas 和 scikit-image 论文,它们最近分别发表在 Journal of Open Research Software 和 PeerJ 上。
  • 谢谢!我正在努力在我的 Windows 机器上安装 scikit-image,似乎无法找到如何处理 .whl 文件...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2015-08-16
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多