Scipy的imsave和imread如何更改格式?

3
当我保存图像时,它的格式是numpy.uint16,当我加载它时,它变成了numpy.uint8,这让我的整个流程出现了问题。我该如何避免这种情况发生?
我正在调用:
from scipy.misc import imread, imsave
image = imread(path)
imread(image_path)

你正在编写JPEG吗?如果是的话,那是不可避免的,因为它本质上是8位的。尝试使用PNG或TIFF或NetPBM PAM / PPM,它们都支持16位样本。 - Mark Setchell
我正在使用tiff数据,并且希望保留16位格式。您对以下解决方案有什么补充意见,或者您认为它已经可以正常工作了? - Baron Yugovich
1
我不确定为什么你会接受一个写入8位JPEG而不是你明确想要16位TIFF的答案... - Mark Setchell
你知道我如何有效处理16位的tiff文件吗? - Baron Yugovich
我不明白。这就是下面我的回答所显示的内容。 - Mark Setchell
假设 img 是一个类型为 uint16 的 numpy 数组,下面的代码应该仍然有效:imageio.imwrite('img_saved.tif', img)img_read = imageio.imread('img_saved.tif')。要确认一下,您可以检查 img_read.dtype 返回的输出。 - Lakshay Sharma
2个回答

7

imsaveimread方法已被弃用,将在未来版本的SciPy中删除。使用imageio.imwriteimageio.imread可以解决此问题。

>>> import imageio
>>> img = imageio.imread('img.jpg')
>>> img.dtype
dtype('uint8')
>>> imageio.imwrite('img_saved.jpg', img)
>>> img_read = imageio.imread('img_saved.jpg')
>>> img_read.dtype
dtype('uint8')

1
使用 imageio.imsave ... 应该解决这个问题 -- 该函数不存在。你是指 .imwrite 吗? - nh2
1
@nh2 - 是的;将该句子的部分编辑以匹配代码。 - Lakshay Sharma
@nh2 这很奇怪,这个代码确实可以工作 imageio.imsave('hello.jpg', maps,vmax=1,vmin=-1) 但是我找不到任何文档! - Black Jack 21

0
我会像这样将16位灰度数据写入和从TIFF中读取:
#!/usr/local/bin/python3

import numpy as np
from PIL import Image

# Make a greyscale image of random 16-bit ints in range 0..65535
arr = np.random.randint(0,65535,(320,240), dtype=np.uint16)

# Make PIL image from numpy array and save
im=Image.fromarray(arr).save("result.tif")

# Re-read from file
reloadedim  = Image.open("result.tif")
reloadedarr = np.array(reloadedim)

# Calculate difference
diff = arr - reloadedarr
print("Number of different pixels: {}".format(sum(diff.ravel())))

它打印出"不同像素的数量:0"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接