-1

array1所以我有一个np.unique(array1)给我[0 1 7 8]值的一维 int64 numpy 数组。

我转换array1为 uint8 图像数组array2,如下所示array2 = (array1 * 50).astype(np.uint8):考虑到唯一像素值 [0 1 7 8] 的值太小,乘数 50 至少可以使我的输出可视化。

现在,当我尝试array1按如下方式检索时:

    [1] recon_array1 = array2.astype(np.int64)/50
    [2] recon_array1 = recon_array1.astype(np.int64)

并且执行np.unique(recon_array1),它实际上给了我[0 1 2]。我认为这是因为多次转换,例如 [1] 实际上给了我一个dtype = float64具有唯一值的[0 1 1.88 2.88]。因此,认识到这一点并将其转换为 int64,就像在 [2] 中一样,输出[0 1 2]是有意义的。

我的最终目标是检索array1具有唯一值的原件[0 1 7 8]。有人可以指出我的错误吗?array1是否仍然可以检索,应该进行什么样的转换处理?谢谢你。

4

1 回答 1

0

问题是 unit8 转换,当您执行此转换时,您得到的是此操作的结果:x%256因此您将您的数字除以 256 并保留其余部分。

我不知道如何做相反的过程,因为:

In [35]: 350%256 # (7*50).uint8
Out[35]: 94

In [36]: 1630%256 
Out[36]: 94

所以实际上只有 array2 的值​​的结果是不可能知道它是 350 还是 1630 或任何其他n*256+94n = {1,...n}

希望能帮助到你...

建议

要创建图像而不是使用 uint8,您可以创建一个映射 (0,255),因此数组的最大值为 255,较小的值为 0,这样您就可以进行反向计算。

import numpy as np

array1 = np.array([0, 1, 7, 8])

fn = lambda x: x*255/max(array1)

invfn = lambda x: x*max(array1)/255

array2 = fn(array1)

recon_array1 = (invfn(array2)).astype(np.int64)
recon_array1 = recon_array1.astype(np.int64)

于 2020-06-24T09:39:39.207 回答