0

我想在 Python 中使用 PIL 创建一个 48 位 (RGB) TIFF 文件(每通道 16 位)。然而,即使我找到了一种将单个通道存储为 16 位的方法,我也无法将它们合并到一个 48 位 RGB 图像中:

In [3]: import numpy as np

In [4]: from PIL import Image

In [5]: r = np.array([[1,2],[3,4]], dtype=np.uint16)

In [6]: i = Image.fromarray(r, mode='I;16')

In [7]: Image.merge("RGB", (i,i,i))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-35aa00ddbb2e> in <module>()
----> 1 Image.merge("RGB", (i,i,i))

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/Image.pyc in merge(mode, bands)
   2059     for im in bands[1:]:
   2060         if im.mode != getmodetype(mode):
-> 2061             raise ValueError("mode mismatch")
   2062         if im.size != bands[0].size:
   2063             raise ValueError("size mismatch")

ValueError: mode mismatch

有没有人对如何解决这个问题有任何想法?还是我需要将通道保存为单独的 16 位文件并与不同的软件结合使用?

4

2 回答 2

3

PIL 不支持 48 位 RGB输出。请参阅支持的模式列表,在此处重复以完成:

  • 1(1 位像素,黑白,每字节存储一个像素)
  • L(8 位像素,黑白)
  • P(8 位像素,使用调色板映射到任何其他模式)
  • RGB(3x8 位像素,真彩色)
  • RGBA(4x8 位像素,带有透明蒙版的真彩色)
  • CMYK(4x8 位像素,分色)
  • YCbCr(3x8 位像素,彩色视频格式)
  • I(32 位有符号整数像素)
  • F(32 位浮点像素)

PIL 还为一些特殊模式提供有限支持,包括LA(带 alpha 的 L)、RGBX(带填充的真彩色)和RGBa(带预乘 alpha 的真彩色)。但是,PIL 不支持用户自定义模式;如果您要处理上面未列出的波段组合,请使用一系列 Image 对象。

另请注意,PIL 确实支持导入48 位 RGB,但它在导入时将其转换为 32 位 RGBA(请参阅 unpackRGB16B 函数)。

于 2013-07-09T22:11:59.560 回答
3

正如文档和 jterrace 的回答所说,如果你想要 RGB16 和 PIL,你必须:

使用一系列 Image 对象。

这是否意味着您需要Image单独保存对象并将它们与不同的软件结合使用?

这是显而易见的答案。但可能有更好的方法。将 R、G 和 B 平面像素图交错到单个 RGB 像素图是微不足道的(并且很快,使用 numpy),因此您可以只创建一个原始像素图,而不是尝试创建一个Image. 您可以将其保存到二进制文件中,或者,如果您选择的“不同软件”是 Python 库,则只需在内存中执行。

于 2013-07-09T22:22:17.910 回答