【问题标题】:How can I store each pixel in an image as a 16 bit index into a colortable?如何将图像中的每个像素作为 16 位索引存储到颜色表中?
【发布时间】:2013-12-22 02:24:57
【问题描述】:

我有一个二维浮点值数组:

float values[1024][1024];

我想存储为图像。

值在范围内:[-range,+range]。

我想使用从红色(-范围)到白色(0)到黑色(+范围)的颜色表。

到目前为止,我一直使用 BMP 文件格式将每个像素存储为 32 位 RGBA。存储我的数组的总内存是 1024*1024*4 字节 = 4MB。

知道我的颜色表是“一维”而 32 RGBA 是“四维”,这似乎非常广泛。

明白我的意思;假设我的颜色表从黑色(-范围)变为蓝色(+范围)。 在这种情况下,唯一变化的组件显然是 B,所有其他组件都是固定的。 所以我只得到了 8 位的精度,而我“支付”了 32 位:-(。

因此,我正在寻找一种基于“调色板”的文件格式。 理想情况下,我希望每个像素都是一个 16 位索引(无符号短整数)到一个由 2^16 个 RGBA 值组成的“调色板”中。 在这种情况下,用于存储我的数组的总内存为:1024*1024*2 字节 + 2^16*4 字节 = 2.25 MB。 所以我会以几乎一半的“价格”获得两倍的精度!

哪些图像格式支持此功能?

目前我正在使用 Qt 的 QImage 将数组作为图像写入文件。 QImage 具有内部 8 位索引(“调色板”)格式。我想要一个16位的。我也没有从 Qt 的文档中了解哪些文件格式支持 8 位索引内部格式。

【问题讨论】:

标签: c++ c qt image-processing


【解决方案1】:

将其存储为 16 位灰度 PNG,然后自己手动制作颜色表。

您没有说明为什么您的图像可以分解为 2^16 种颜色,但利用您对这张特殊图像的了解,您可以制定一种算法,使彼此接近的索引具有相似的颜色,因此更容易压缩。

【讨论】:

  • 正确。 “灰度”真正的意思是“单通道”,这里就是这样。
【解决方案2】:

“我想使用从红色(-范围)到白色(0)到黑色(+范围)的颜色表。”

好的,所以你有 FF,00,00(红色)到 FF,FF,FF(白色)到 00,00,00(黑色)。在 24 位 RGB 中,这在我看来像是从红色到白色的 256 个值,然后是从白色到黑色的另一个 256 个值。所以你不需要 2^16 (16384) 的调色板大小;你需要 2^9 (512)。

如果您愿意妥协并使用 2^8 的调色板大小,那么 GIF 格式可以工作。这仍然是相对精细的分辨率:负片上有 128 种红色,正片上有 128 种灰色。 GIF 的 256 个调色板条目中的每一个都可以是 RGB 值。

PNG 是另一种基于调色板的颜色。如果您需要 Alpha 通道,您可以使用 PNG,包括 RGBA 来获得更大的灵活性。

您在问题中提到了 RGBA,但没有解释 alpha 通道的使用。

因此独立于文件格式,如果您可以使用 256 条目调色板,那么您将获得一个非常好的压缩图像。回到您的映射要求(即映射浮动 [-range -> 0.0 -> +range] 到 [red -> white -> black],这是一个 256 个条目的调色板,涵盖了您想要的范围 red-white-black:

float    entry#  color  rgb
------  -------  -----  --------
-range    0  00  red    FF,00,00
          1  01         FF,02,02
          2  02         FF,04,04
             ...          ...
             ...          ...
        127  7F         FF,FD,FD
  0.0   128  80  white  FF,FF,FF
        129  81         FD,FD,FD
             ...          ....
             ...          ...
        253  FD         04,04,04
        254  FE         02,02,02
+range  255  FF  black  00,00,00

如果将颜色表的大小加倍为 9 位(512 个值),那么您可以使 RGB 条目之间的增量更精细:增量为 1 而不是 2。这样的 9 位调色板将为您提供完整的单- 范围的负侧和正侧的 RGB 通道分辨率。给定您想要做的映射,分配 16 位调色板是否真的能够存储更多视觉信息尚不清楚。我希望我能理解你的问题,也许这会有所帮助。

【讨论】:

    【解决方案3】:

    PNG format 支持高达 8 位的调色板格式,但也应支持高达 16 位的灰度图像。但是,16 位模式使用较少,可能缺少软件支持。您应该先测试您的工具。

    但您也可以使用纯 24 位 RGB 真彩色 PNG 图像进行测试。它们经过压缩,在任何情况下都应该比 BMP 产生更好的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2022-11-26
      • 2018-04-01
      • 2018-04-19
      • 2015-08-04
      相关资源
      最近更新 更多