Python中的Pillow模块坚持要打开一个我拥有的32位/像素TIFF文件,就好像像素是float32类型一样,而我相信正确的解释是unsigned int32。如果我继续将数据加载到float32类型的640x512数组中,如何在保留基础二进制表示形式的同时将其重新键入为uint32?
在Fortran和C中,很容易使不同类型的指针或数据结构指向相同的物理内存块,以便可以根据我想要的任何类型轻松地解释原始内存的内容。 Python中有等效的过程吗?
后面是示例(请注意,我没有有关压缩等的信息;该文件是由商业软件程序从专有文件格式中提取的):
from PIL import Image
infile = "20181016_071207_367_R.tif"
im = Image.open(infile)
data = np.array(im.getdata())
print(data)
[-9.99117374 -10.36103535 -9.80696869 ... -18.41988373 -18.35027885 -18.69905663]
答案 0 :(得分:1)
假设您最初拥有<p><br></p>
等于im.mode
,则可以强制Pillow以不同的方式(确实是非常不寻常的愿望)以某种有点怪异的方式重新加载相同的数据:
F
更一般而言(在PIL上下文之外),每当遇到需要处理Python中的原始内存表示形式时,通常都应依赖imnew = im.convert(mode='I')
imnew.frombytes(im.tobytes())
或Python内置的numpy
类, memoryview
模块。
这里是将numpy struct
的数组重新解释为float32
的示例:
int32
以下是使用a = np.array([1.0, 2.0, 3.0], dtype='float32')
a_as_int32 = a.view('int32')
进行此操作的示例:
memoryview
答案 1 :(得分:0)
在这种情况下,答案是Pillow正在使用从热像仪导出的图像中指定的正确类型(浮点32)加载图像。无需将图像转换为整数,否则将导致错误的结果。