Python 如何在非二进制图像上使用scipy.label
我需要给已经分类的img贴上标签。问题是,图像是非二进制的,我需要分别计算不同值的相邻面片 考虑到以下数据集:Python 如何在非二进制图像上使用scipy.label,python,numpy,ndimage,Python,Numpy,Ndimage,我需要给已经分类的img贴上标签。问题是,图像是非二进制的,我需要分别计算不同值的相邻面片 考虑到以下数据集: 将numpy导入为np 数据=np.0((6,6),数据类型=np.uint16) 数据[2:4,2:4]=10 数据[4,4]=10 数据[:2,:3]=22 数据[0,5]=22 数据 >>> 数组([[22,22,22,0,0,22], [22, 22, 22, 0, 0, 0], [0, 0, 10, 10, 0, 0], [0, 0, 10, 10, 0,
将numpy导入为np
数据=np.0((6,6),数据类型=np.uint16)
数据[2:4,2:4]=10
数据[4,4]=10
数据[:2,:3]=22
数据[0,5]=22
数据
>>>
数组([[22,22,22,0,0,22],
[22, 22, 22, 0, 0, 0],
[0, 0, 10, 10, 0, 0],
[0, 0, 10, 10, 0, 0],
[0, 0, 0, 0, 10, 0],
[0,0,0,0,0,0]],数据类型=uint16)
我希望获得(8 neigbours结构元素)以下信息:
数组([[1,1,1,0,0,3],
[1, 1, 1, 0, 0, 0],
[0, 0, 2, 2, 0, 0],
[0, 0, 2, 2, 0, 0],
[0, 0, 0, 0, 2, 0],
[0,0,0,0,0,0]],数据类型=uint16)
但使用scipy.label函数,我得到了完全不同的结果:
从scipy导入ndi图像作为ndi
生成二进制结构(2,2)
带标签的数组,num\u features=ndi.label(数据,结构=s)
标号数组
>>>
数组([[1,1,1,0,0,2],
[1, 1, 1, 0, 0, 0],
[0, 0, 1, 1, 0, 0],
[0, 0, 1, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0,0,0,0,0,0]],dtype=int16)
那么,有没有一个技巧来分离不同值的补丁呢?获取一个唯一值列表
uv
,然后用其顺序号替换每个唯一值(第一个值为0,第二个值为1等)
例如:
import numpy as np
data = np.zeros((6,6), dtype=np.uint16)
data[2:4, 2:4] = 10
data[4, 4] = 10
data[:2, :3] = 22
data[0, 5] = 32
结果:
array([[2, 2, 2, 0, 0, 3],
[2, 2, 2, 0, 0, 0],
[0, 0, 1, 1, 0, 0],
[0, 0, 1, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0]])
[[2 2 2 0 0 3]
[2 2 2 0 0 0]
[0 0 1 1 0 0]
[0 0 1 1 0 0]
[0 0 0 0 1 0]
[0 0 0 0 0 0]]
更新我看到您更改了问题中的数据。在这种情况下,它不再是已经分类的图像,因为
数据[0,5]
不能22
如果它没有与所有其他22
s链接。因此,在这种情况下,我想您需要分别为数据中的每个唯一entrie进行标记,如下所示:
import numpy as np
from scipy import ndimage as ndi
data = np.zeros((6,6), dtype=np.uint16)
data[2:4, 2:4] = 10
data[4, 4] = 10
data[:2, :3] = 22
data[0, 5] = 22
uv = np.unique(data)
s = ndi.generate_binary_structure(2,2)
cum_num = 0
result = np.zeros_like(data)
for v in uv[1:]:
labeled_array, num_features = ndi.label((data==v).astype(int), structure=s)
result += np.where(labeled_array > 0, labeled_array + cum_num, 0).astype(result.dtype)
cum_num += num_features
数据:
结果:
array([[2, 2, 2, 0, 0, 3],
[2, 2, 2, 0, 0, 0],
[0, 0, 1, 1, 0, 0],
[0, 0, 1, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0]])
[[2 2 2 0 0 3]
[2 2 2 0 0 0]
[0 0 1 1 0 0]
[0 0 1 1 0 0]
[0 0 0 0 1 0]
[0 0 0 0 0 0]]
我不明白您的最终目标是什么:所需的结果与给定的数组相同,只交换了标签号
1
和2
。不幸的是,我将更改数字以使自己更清楚。我不想让左上角的补丁贴上中间那个补丁的标签,即使它们相互接触。我费了一点劲才找到一个简单的用例。。。很抱歉我所拥有的图像在GIS意义上被分类,即RGB初始图像现在被分类为与一个波段中的单个值相关联的“区域”。原始图像为国家大小,分辨率为30米。。。这不是我可以在github上轻松分享的东西。最后你成功了