0

如果我有一个 NumPy 数组dtype=np.uint16,如何将数据保存为uint16JPEG 压缩文件?

然后如何加载uint16JPEG 压缩数据?

枕头似乎不支持这一点,至少不通过将文件保存为jpg扩展名,请参阅枕头图像文件格式

4

1 回答 1

3

您不能以(普通旧)JPEG格式保存 16 位图像。只允许使用 8 位和 12 位(参见 ISO/IEC 10918-1)。您可能会查看JPEG 2000,它也支持 16 位。

Pillow 支持 JPEG 2000。不幸的是,我无法保存 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 数组,就会想到OpenCVcv2.imwrite ,它的方法也支持 JPEG 2000。使用 OpenCV,我还能够保存 16 位 RGB 图像:

import cv2
import numpy as np

image_array = np.uint16(np.random.rand(200, 200, 3) * 65535)
cv2.imwrite('image_cv.jp2', image_array)

并且,在 GIMP 中打开image_cv.jp2会显示 16 位 RGB 图像。

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

或者,您可以选择(压缩)PNG。

希望有帮助!

于 2019-11-21T06:26:04.780 回答