Python 如何在非实心黑色背景中标记不同的对象?

Python 如何在非实心黑色背景中标记不同的对象?,python,image-processing,numpy,scipy,Python,Image Processing,Numpy,Scipy,我知道如果背景色不是纯黑色,scipy.ndimage.label就无法添加标签。 所以我有一个黑色背景的图像,它不是纯黑色的,所以我们不能假设所有像素的RGB值都是(0,0,0) 如何准备图像以便使用ndimage.label 这是一个类似于测试的图像: 注: (1) 图像从RGB转换为PNG灰度 (2) 背景颜色不同。 (3) ndimage.label将整个图像标记为一个对象。 谢谢您可以将小于某个阈值的所有值设置为0,然后调用标签: In [16]: img2 = img.copy()

我知道如果背景色不是纯黑色,
scipy.ndimage.label
就无法添加标签。
所以我有一个黑色背景的图像,它不是纯黑色的,所以我们不能假设所有像素的RGB值都是(0,0,0)

如何准备图像以便使用
ndimage.label

这是一个类似于测试的图像:

注:
(1) 图像从
RGB
转换为
PNG灰度

(2) 背景颜色不同。
(3)
ndimage.label
将整个图像标记为一个对象。

谢谢

您可以将小于某个阈值的所有值设置为0,然后调用标签:

In [16]: img2 = img.copy()     # Copy the image.

In [17]: img2[img2 < 20] = 0   # Set all values less than 20 to 0.

In [18]: lbl, n = label(img2)

In [19]: n
Out[19]: 2
[16]中的
:img2=img.copy()#复制图像。
在[17]:img2[img2<20]=0中,将所有小于20的值设置为0。
In[18]:lbl,n=标签(img2)
In[19]:n
Out[19]:2

这是一种尽可能增加对比度的简单方法,使任何“亮”变成白色,“暗”变成黑色。假设8位灰度,并调整@Warren Weckesser答案中的代码:

img2 = img.copy()     # Copy the image.
img2[img2 < 128] = 0   # Set all values less than 128 to 0 (black).
img2[img2 >= 128] = 255   # Set all values equal or greater than 128 to 255 (white).
lbl, n = label(img2)
img2=img.copy()#复制图像。
img2[img2<128]=0#将所有小于128的值设置为0(黑色)。
img2[img2>=128]=255#将所有大于或等于128的值设置为255(白色)。
lbl,n=标签(img2)

让我知道这是否对您有效。

很好,但我必须问一下,是否有任何方法可以自动确定适当的阈值??因为我可以猜到您是通过'pylab.hist(ist)计算出该值的。对吗?谢谢,实际上,我只是查看了块img[:5,:5],看到了9和10等值,所以我尝试了20个,效果非常好。换句话说:一个幸运的猜测。您使用直方图的想法可能是自动确定适当阈值方法的一个良好开端。感谢您的努力。请毫不犹豫地发布任何新想法。为什么不消除差异?从本质上说,这是在尽可能地提高对比度。因此,如果该值超过黑色的一半,则为黑色,反之亦然。@JamieBull你说得对。为什么不在帖子中说明你的答案,这样我就可以接受它。谢谢,它是有效的,但它仍然不是通用的。我想你会用直方图来确定你所说的自动差异。我会接受你的答案不管怎样,谢谢你必须有一个相当奇怪的图像,这样当你把它分成两组时,它才值得去做直方图。如果您需要两个以上的集合(如后期处理/颜色量化算法的一些变体),那么这可能是一个很好的方法。很高兴这对你有用。