使用 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
标签对象 1
和 2
因为,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=0
和 img=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)
我的目标是使用 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
标签对象 1
和 2
因为,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=0
和 img=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)