使用 scikit-image 标签计算对象

counting objects using scikit-image label

我的目标是使用 Python 对二进制数组中的对象进行计数。我正在应用 scikit-image measure.label 来计算数组中的对象(应该是 1),尽管阅读了文档 -link,但我得到的结果无法解释。

a=np.array(np.matrix('0 1 0 0 1;0 1 0 0 0; 0 0 0 0 0;0 0 0 0 1'))
print(a)
img=measure.label(a)
propsa = measure.regionprops(img)
length = len(propsa)
print ('length='+str(length))
for label in propsa:
    print (label.centroid)

>>> 
[[0 1 0 0 1]
 [0 1 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 1]]
length=3
(0.5, 1.0)
(0.0, 4.0)
(3.0, 4.0)

当背景选择为零时,

a=np.array(np.matrix('0 1 0 0 1;0 1 0 0 0; 0 0 0 0 0;0 0 0 0 1'))
print(a)
img=measure.label(a, background=0)
propsa = measure.regionprops(img)
length = len(propsa)
print ('length='+str(length))
for label in propsa:
    print (label.centroid)

>>>
[[0 1 0 0 1]
 [0 1 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 1]]
length=2
(0.0, 4.0)
(3.0, 4.0)

为什么会出现不一致?根据我的理解,标签函数将“0”标记为 -1 背景?!

以下问题 CSV 文件 example 的 measure.label 似乎计算了两个物体,一个大物体及其空腔。果然,当我查询 img 的空腔坐标时,我得到的值为 2。这意味着空腔是第二个对象。为什么零的集合算作一个对象,并且在它周围?

length=2
(214.23444957510378, 505.25546156532539)
(238.77173913043478, 740.28260869565213)
>>> img[238,740]
2
>>> 

出于调试目的,打印完整标记的图像很有用。随着 background=0:

>>> print(img)
[[-1  0 -1 -1  1]
 [-1  0 -1 -1 -1]
 [-1 -1 -1 -1 -1]
 [-1 -1 -1 -1  2]]

背景被正确标记为 -1。但是当你在上面调用 regionprops 时,它只会 returns RegionProperties 标签对象 12 因为,as stated in the docs for regionprops(),

label_image : (N, M) ndarray

Labeled input image. Labels with value 0 are ignored.

因此,第一个带有标签 0 的区域将被忽略。

当未指定 background 时,0 填充区域具有标签 0,因此被 regionprops() 忽略,给出其余三个的输出1-填充区域:

>>> print(img)
[[0 1 0 0 2]
 [0 1 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 3]]

好的,这是让我印象深刻的简单解决方案。 我可以简单地定义 background=0img=img+1。 问题是,当在背景=0 的矩阵上应用标签时,0 值更改为 -1,如果我有一组值,则通过添加 1 将它们减少到 0.Therefore,我调整 img object to background=0 并且任何不为 0 的数字组都将被计算在内。

这是我的意思的一个例子:

    import matplotlib
    matplotlib.use('Gtk3Agg')
    import numpy as np
    from skimage import filters, morphology, measure
    np.set_printoptions(threshold=np.nan)

a=np.array(np.matrix('0 1 0 0 1;0 1 0 0 0; 0 0 0 0 0;0 0 0 1 1'))

print(a)

img=measure.label(a, background=0)
print('img=')
print (img)
#adjusting +1
img=img+1
print('img+1=')
print (img)
propsa = measure.regionprops(img)
length = len(propsa)
print ('length='+str(length))
for label in propsa:
    print (label.centroid)

代码returns如下。

>>> 
(4, 5)
[[0 1 0 0 1]
 [0 1 0 0 0]
 [0 0 0 0 0]
 [0 0 0 1 1]]
img=
[[-1  0 -1 -1  1]
 [-1  0 -1 -1 -1]
 [-1 -1 -1 -1 -1]
 [-1 -1 -1  2  2]]
img+1=
[[0 1 0 0 2]
 [0 1 0 0 0]
 [0 0 0 0 0]
 [0 0 0 3 3]]
length=3
(0.5, 1.0)
(0.0, 4.0)
(3.0, 3.5)