如何将 Unsigned Char 图像文件读取到 Python?

How to read an Unsigned Char image file to Python?

我有一个名为“.image”的扩展名的文本文件,文件顶部如下:

Image Type: unsigned char
Dimension: 2
Image Size: 512 512
Image Spacing: 1 1
Image Increment: 1 1
Image Axis Labels: "" "" 
Image Intensity Label: ""
193

我认为这是一个 unsigned char 文件,但我很难在 python 中打开它(并将其另存为 jpg、png 等)

已尝试标准 PIL.Image.open(),保存为字符串并使用 Image.fromstring('RGB', (512,512), string) 读取,以及读取为类字节对象 Image.open(io.BytesIO(filepath))

有什么想法吗?提前致谢

如果我们假设文件上有一些任意的、未知长度的文件头,我们可以读取整个文件,然后不解析文件头,只从文件尾部取出最后的 512x512 字节:

#!/usr/bin/env python3

from PIL import Image
import pathlib

# Slurp the entire contents of the file
f = pathlib.Path('image.raw').read_bytes()

# Specify height and width
h, w = 512, 512

# Take final h*w bytes from the tail of the file and treat as greyscale values, i.e. mode='L'
im = Image.frombuffer('L', (w,h), f[-(h*w):], "raw", 'L', 0, 1)

# Save to disk
im.save('result.png')

或者,如果您更喜欢 Numpy 而不是 Pathlib:

#!/usr/bin/env python3

from PIL import Image
import numpy as np

# Specify height and width
h, w = 512, 512

# Slurp entire file into Numpy array, take final 512x512 bytes, and reshape to 512x512
na = np.fromfile('image.raw', dtype=np.uint8)[-(h*w):].reshape((h,w))

# Make Numpy array into PIL Image and save
Image.fromarray(na).save('result.png')

或者,如果您真的不想写任何 Python,只需在终端中使用 tail 将文件的最后 512x512 字节切掉并告诉 ImageMagick 从灰度字节值生成 8 位 PNG:

tail -c $((512*512)) image.raw | magick -depth 8 -size 512x512  gray:- result.png