我的目标是使用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
>>>
答案 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
时,它只返回标记RegionProperties
和1
的{{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=0
和img=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)