如何保存具有负值的PIL图像。

5

我正在尝试使用PIL保存一个带有负值的图像,但是在保存后,图像文件中所有的负值都被裁剪为0。

from PIL import Image
import numpy as np

# generate random image for demo
img_arr = np.random.random_integers(-1000,1000, size=[10,10]).astype(np.int32)
print "original min {}, max: {}".format(img_arr.min(),img_arr.max())

# create PIL image
img1 = Image.fromarray(img_arr)
print "PIL min {}, max: {}".format(np.array(img1.getdata()).min(),np.array(img1.getdata()).max())

# save image
img1.save("test_file.png", "PNG")

# reload image
img_file = Image.open("test_file.png")
print "img_file min {}, max: {}".format(np.array(img_file.getdata()).min(),np.array(img_file.getdata()).max())

这将导致以下输出:
original min -983, max: 965
PIL min -983, max: 965
img_file min 0, max: 965

我该如何保存这张图片并保留负值?

4
如果你可以保存一个带有负值的图像,如果你打开它会长什么样子呢?如果 (255,255,255) 表示白色,(0,0,0) 表示黑色,那么 (-1000,-1000,-1000) 代表什么?是四重负白色吗? - Kevin
图像的颜色由一个或多个8位无符号整数组成的像素定义,因此无法创建具有值超出0..255范围的分量的像素。您需要将结果缩放到此范围以保持它们。PIL支持更大的范围,例如0..4095,因此您可以保留更精确的数据。我认为它还支持正浮点值,但从未尝试过。 - martineau
大多数浏览器只允许0-255,而一般图像没有这个限制。 - Greg Samson
1个回答

7
请注意,根据PIL的规定,可以将像素存储为32位有符号整数,并且图像模式'I'旨在在PIL中处理此类情况。因此,那些声称由于技术原因这是没有意义的评论是错误的。
我认为PNG格式不支持此模式(尽管以模式'I'写入图像时不会出现错误)。但是,扩展名.tif似乎支持此模式:
img1.save("test_file.tif")

更改那个(以及读取正确文件)似乎可以解决问题:
original min -993, max: 990
PIL min -993, max: 990
img_file min -993, max: 990

谢谢,这个可行。顺便提供一个很好的链接,介绍了数据类型及其范围。http://scikit-image.org/docs/dev/user_guide/data_types.html - Greg Samson
请注意,当您想保存多通道图像(如RGB图像)时,此代码将失败。当 size=[10,10, 3] 时,img1.save("test_file.tif") 将无法成功保存! - Swaroop

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