使用scikit-image标签计算对象

时间:2015-11-19 23:14:34

标签: python object numpy counting scikit-image

我的目标是使用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
>>> 

2 个答案:

答案 0 :(得分:3)

出于调试目的,打印完整标记图像很有用。使用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时,它只返回标记RegionProperties1的{​​{1}}个对象,因为as stated in the docs for regionprops()

  

label_image:(N,M)ndarray

     

标记的输入图像。 值为0的标签将被忽略。

因此,忽略标记为2的第一个区域。

如果未指定0,则background - 填充区域的标签为0,因此被0忽略,并显示其余三个regionprops()的输出1}} - 填充区域:

1

答案 1 :(得分:2)

好的,这是一个让我印象深刻的简单解决方案。 我可以简单地定义background=0img=img+1。 问题是,当标签应用于具有background = 0的矩阵时,0值将更改为-1,如果我有一组则将它们减少为0.因此,通过添加1,我将img对象调整为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)

代码返回以下内容。

>>> 
(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)