如何使用JPEG压缩保存uint16 NumPy数组,并加载uint16 JPEG压缩数据?

问题描述 投票:0回答:1

如果我有一个带有dtype=np.uint16的NumPy数组,如何将数据另存为uint16 JPEG压缩?

然后如何加载uint16 JPEG压缩数据?

[Pillow似乎不支持此功能,至少不是通过将文件另存为jpg扩展名,请参阅Pillow image file formats

python python-imaging-library jpeg uint16
1个回答
0
投票

您无法以(普通)JPEG格式保存16位图像。仅允许使用8位和12位(请参阅ISO / IEC 10918-1)。您可以查看JPEG 2000,它也支持16位。

Pillow has JPEG 2000 support。不幸的是,我无法保存16位RGB图像。我所能做的最好是一张16位灰度图像:

import numpy as np
from PIL import Image

image_array = np.uint16(np.random.rand(200, 200) * 65535)
image_pil = Image.fromarray(image_array, 'I;16')
image_pil.save('image_pil.jp2')

在GIMP中打开image_pil.jp2确实显示了16位灰度图像。

由于您已经有了NumPy数组,因此想到OpenCV,其cv2.imwrite方法也支持JPEG 2000。使用OpenCV,我还可以保存16位RGB图像:

cv2.imwrite

并且,在GIMP中打开import cv2 import numpy as np image_array = np.uint16(np.random.rand(200, 200, 3) * 65535) cv2.imwrite('image_cv.jp2', image_array) 将显示16位RGB图像。

默认情况下,OpenCV禁用JPEG 2000支持。您必须显式设置环境变量image_cv.jp2

或者,您可以使用(压缩的)PNG。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.