Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在非二进制图像上使用scipy.label_Python_Numpy_Ndimage - Fatal编程技术网

Python 如何在非二进制图像上使用scipy.label

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,

我需要给已经分类的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,  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上轻松分享的东西。最后你成功了