gpt4 book ai didi

python - 使用 Scipy imsave 将 Numpy 数组保存到图像时保留未更改的数据

转载 作者:太空狗 更新时间:2023-10-30 02:12:44 26 4
gpt4 key购买 nike

当使用 Scipy toimageimsave 保存二维 Numpy 数组(单值)时,像素值与 Numpy 数组中的像素值不完全匹配。相反,有些区域(主要是边缘)图像算法似乎使用了某种插值。

是否有停止插值并保留准确数据的选项(例如 7 总是在 PNG 中得到 rgb(7,7,7)?

最佳答案

如果您有一个 2D numpy 数组,那么您将保存为灰度 PNG,因此您永远不会获得 rgb 图像(只有一个 channel )。我不确定你所说的单值是什么意思,也许是单精度 float ?尽管 PIL 支持单精度 float ,但 PNG 不支持。保存为 PNG 时,您可以使用每 channel 8 位(默认)或每 channel 16 位。这意味着您的数组将被缩放到最大 2^8/2^16(8/16 位),并转换为整数。正是在这种转换中,结果可能略有不同。

scipy.misc.image 似乎没有保存为 16 位的选项,因此它总是会写入 8 位 PNG。但是您可以使用 scipy.misc.toimage 创建 16 位图像,只需确保传递 mode='I'。还要确保指定数组的最小值和最大值以避免缩放。以下是使用它保存 16 位 png 的方法:

import numpy as np
import scipy.misc

a = np.random.uniform(0, 2**16 - 1, (500, 500)).astype('int32')
img = scipy.misc.toimage(a, high=np.max(a), low=np.min(a), mode='I')
img.save('my16bit.png')

# check that you got the same values
b = scipy.misc.imread('my16bit.png')
b.dtype
# dtype('int32')
np.array_equal(a, b)
# True

请注意,在本示例中,我使用了 int32 作为数据类型。但是,数据仍必须适合 uint16。如果您输入负值或大于 2^16 的值,这些值将在保存为 PNG 时被裁剪。相反,即使 sp.misc.imread 读取为 int32,数据也永远不会超过 uint16

总结:如果您想将完全相同的 numpy 数组写入 PNG,您需要确保它是 uint8/uint16 类型,并且您通过正确的 high/low/modescipy.misc.toimage

关于python - 使用 Scipy imsave 将 Numpy 数组保存到图像时保留未更改的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com