scipy.ndimage.label:包含误差范围
scipy.ndimage.label: include error margin
阅读了关于 scipy.ndimage.label (Variable area threshold for identifying objects - python) 的有趣主题后,我想在标签中包含一个 'error margin'。
在上面的链接讨论中:
如何也包括顶部的蓝点(假设它错误地与橙色的最大对象断开连接)?
我找到了 structure 属性,它应该能够通过改变数组(从 np.ones(3,3,3) 到更多的东西(我希望它是3D)。然而,将 'structure' 属性调整为更大的数组似乎不起作用,不幸的是。它要么给出维度错误 (RuntimeError: structure and input must have equal rank
) 或者它不会改变任何东西..
谢谢!
这是代码:
labels, nshapes = ndimage.label(a, structure=np.ones((3,3,3)))
其中a是一个三维数组。
这是一种使用 scipy.ndimage.binary_dilation
的可能方法。在 2D 示例中更容易看出发生了什么,但我将在最后展示如何推广到 3D。
In [103]: a
Out[103]:
array([[0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 1, 0, 0],
[1, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[1, 1, 1, 0, 0, 0, 0]])
In [104]: from scipy.ndimage import label, binary_dilation
将每个 "shape" 向下和向右扩展一个像素:
In [105]: b = binary_dilation(a, structure=np.array([[0, 0, 0], [0, 1, 1], [0, 1, 1]])).astype(int)
In [106]: b
Out[106]:
array([[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[1, 1, 1, 0, 1, 1, 0],
[1, 1, 1, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 1, 1]])
将label
应用于填充数组:
In [107]: labels, numlabels = label(b)
In [108]: numlabels
Out[108]: 2
In [109]: labels
Out[109]:
array([[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[2, 2, 2, 0, 1, 1, 0],
[2, 2, 2, 0, 1, 1, 1],
[2, 2, 2, 0, 0, 1, 1],
[2, 2, 2, 2, 0, 1, 1]], dtype=int32)
通过 a
乘以 labels
,我们得到所需的 a
标签数组:
In [110]: alab = labels*a
In [111]: alab
Out[111]:
array([[0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[2, 2, 0, 0, 1, 0, 0],
[2, 2, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[2, 2, 2, 0, 0, 0, 0]])
(这里假定 a
中的值为 0 或 1。如果不是,则可以使用 alab = labels * (a > 0)
。)
对于 3D 输入,您必须将 structure
参数更改为 binary_dilation
:
struct = np.zeros((3, 3, 3), dtype=int)
struct[1:, 1:, 1:] = 1
b = binary_dilation(a, structure=struct).astype(int)
阅读了关于 scipy.ndimage.label (Variable area threshold for identifying objects - python) 的有趣主题后,我想在标签中包含一个 'error margin'。
在上面的链接讨论中: 如何也包括顶部的蓝点(假设它错误地与橙色的最大对象断开连接)?
我找到了 structure 属性,它应该能够通过改变数组(从 np.ones(3,3,3) 到更多的东西(我希望它是3D)。然而,将 'structure' 属性调整为更大的数组似乎不起作用,不幸的是。它要么给出维度错误 (RuntimeError: structure and input must have equal rank ) 或者它不会改变任何东西..
谢谢!
这是代码:
labels, nshapes = ndimage.label(a, structure=np.ones((3,3,3)))
其中a是一个三维数组。
这是一种使用 scipy.ndimage.binary_dilation
的可能方法。在 2D 示例中更容易看出发生了什么,但我将在最后展示如何推广到 3D。
In [103]: a
Out[103]:
array([[0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 1, 0, 0],
[1, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[1, 1, 1, 0, 0, 0, 0]])
In [104]: from scipy.ndimage import label, binary_dilation
将每个 "shape" 向下和向右扩展一个像素:
In [105]: b = binary_dilation(a, structure=np.array([[0, 0, 0], [0, 1, 1], [0, 1, 1]])).astype(int)
In [106]: b
Out[106]:
array([[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[1, 1, 1, 0, 1, 1, 0],
[1, 1, 1, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 1, 1]])
将label
应用于填充数组:
In [107]: labels, numlabels = label(b)
In [108]: numlabels
Out[108]: 2
In [109]: labels
Out[109]:
array([[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[2, 2, 2, 0, 1, 1, 0],
[2, 2, 2, 0, 1, 1, 1],
[2, 2, 2, 0, 0, 1, 1],
[2, 2, 2, 2, 0, 1, 1]], dtype=int32)
通过 a
乘以 labels
,我们得到所需的 a
标签数组:
In [110]: alab = labels*a
In [111]: alab
Out[111]:
array([[0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[2, 2, 0, 0, 1, 0, 0],
[2, 2, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[2, 2, 2, 0, 0, 0, 0]])
(这里假定 a
中的值为 0 或 1。如果不是,则可以使用 alab = labels * (a > 0)
。)
对于 3D 输入,您必须将 structure
参数更改为 binary_dilation
:
struct = np.zeros((3, 3, 3), dtype=int)
struct[1:, 1:, 1:] = 1
b = binary_dilation(a, structure=struct).astype(int)