我正在尝试使用PIL库读取和写入tiff图像。在测试时,我注意到保存以不同方式生成的看似相同的numpy数组会导致磁盘上的映像不同。为什么会这样,我该如何解决?
出于测试目的,我创建了一个image with GIMP (upscaled from 8x8),并将其保存为TIF,读取到numpy数组,然后写回tif文件:
img_gimp = Image.open('img_gimp.tif')
imgarray_gimp = np.array(img_gimp)
img_gimp = Image.fromarray(imgarray_gimp, mode = 'I;16')
img_gimp.save('final_gimp.tif')
结果符合预期,与原始图像相同。到目前为止一切顺利。
现在我直接在python代码中生成了相同的图像:
imgarray_direct = np.zeros(shape = (8, 8)).astype(int)
for i in range(2):
for j in range(2):
image[i][j] = 65535
将此阵列写入磁盘...
img_direct = Image.fromarray(imgarray_direct, mode = 'I;16')
img_direct.save('final_direct.tif')
没有给我预期的结果,相反我发现了这一点: image generated by for loop (upscaled from 8x8)
做
print(np.array_equal(imgarray_gimp, imgarray_direct))
给予True
,并看着print(imgarray_gimp)
和print(imgarray_direct)
,看不到任何区别。
这是预期的行为吗?如果是,原因何在?
谢谢您的回答!
答案 0 :(得分:0)
正如@MarkSetchell在评论中所暗示的那样,问题在于您的dtype
原始数据的numpy数组与之后提供的PIL图像mode
字符串不匹配。更改传递到astype
的参数或在创建数组时简单地传递正确的类型对我来说解决了这个问题。修改后的代码如下:
import numpy as np
from PIL import Image
#Generate raw image data (16-bit!)
image_data = np.zeros(shape = (8, 8), dtype=np.uint16)#this is the big change
for i in range(2):
for j in range(2):
image_data[i][j] = 65535
#Save image as TIF to disk
image_direct = Image.fromarray(image_data, mode = 'I;16')
image_direct.save('final_direct.tif')
作为旁注,您使用的模式字符串I;16
是有效的,我感到惊讶;在pillow's documentation中找不到任何提及。