如何将图像中的每个像素作为16位索引存储到颜色表中
How can I store each pixel in an image as a 16 bit index into a colortable?
我有一个浮动值的2D数组:
float values[1024][1024];
我想存储为图像。
值在范围内:[-range,+range]。
我想使用一个从红色(-范围)到白色(0)再到黑色(+范围)的颜色表。
到目前为止,我一直在使用BMP文件格式将每个像素存储为32位RGBA。存储我的数组的总内存为1024*1024*4字节=4MB。
知道我的色表是"1维",而32 RGBA是"4维",这似乎非常有用。
明白我的意思;让我们假设我的颜色表从黑色(-范围)到蓝色(+范围)。在这种情况下,唯一变化的成分显然是B,所有其他成分都是固定的。所以我只得到了8比特的精度,而我正在为32:-(.)"付费"
因此,我正在寻找一种基于"调色板"的文件格式。理想情况下,我希望每个像素都是一个16位索引(无符号短整型),进入由2^16 RGBA值组成的"调色板"。在这种情况下,用于存储阵列的总内存为:1024*1024*2字节+2^16*4字节=2.25 MB。所以我会得到两倍的精度几乎一半的"价格"!
哪些图像格式支持此功能
目前,我正在使用Qt的QImage将数组作为图像写入文件。QImage具有内部8位索引("调色板")格式。我想要一个16位的。此外,我也不了解Qt的文档中哪些文件格式支持8位索引的内部格式。
将其存储为16位灰度PNG,然后自己手动制作颜色表。
你没有说明为什么你的图像可以分解成2^16种颜色,但利用你对这种特殊图像的了解,你可以制定一个算法,使彼此接近的索引具有相似的颜色,因此更容易压缩。
"我想使用一个从红色(-范围)到白色(0)再到黑色(+范围)的颜色表。"
好的,你有FF,00,00(红色)到FF,FF,FF(白色)到00,00,0(黑色)。在24位RGB中,在我看来,从红色到白色有256个值,然后从白色到黑色有256个。所以你不需要2^16(16384)的调色板大小;你需要2^9(512)。
如果你愿意妥协并使用2^8的调色板大小,那么GIF格式可以工作。这仍然是相对精细的分辨率:负片尺寸为128个红色阴影,正片尺寸为28个灰色阴影。GIF的256个调色板条目中的每一个都可以是RGB值。
PNG是基于调色板的颜色的另一个候选者。如果需要alpha通道,您可以使用PNG(包括RGBA)获得更大的灵活性。
您在问题中提到RGBA,但没有解释alpha通道的使用。
因此,与文件格式无关,如果您可以使用256项调色板,那么您将拥有一个非常好的压缩图像。回到您的映射要求(即映射浮动[-range->0.0->+range]到[red->white->black],这里有一个256项的调色板,涵盖了您想要的红白黑范围:
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位调色板是否真的能够存储更多的视觉信息。我希望我能理解你的问题,也许这会有所帮助。
PNG格式支持高达8位的苍白格式,但也应支持高达16位的灰度图像。然而,16位模式的使用较少,并且可能缺乏软件支持。你应该先测试你的工具。
但是你也可以用普通的24位RGB真彩色PNG图像进行测试。它们经过压缩,在任何情况下都应该比BMP产生更好的结果。
- 将浮动的heightmap数组导出为16位原始值
- 宽度为奇数的16位纹理为片状
- OpenGL 16 位模板缓冲区?
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 16 位到 10 位转换代码说明
- AVX2 整数乘以有符号 8 位元素,产生有符号 16 位结果?
- C++将 16 位值转换为 32 位值
- 24 位地址和 24 位算术与 24 位地址与 16 位地址算术之间的区别?
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- AVX2 SIMD Instrinsics 16 位到 8 位,反之亦然
- 如何打开和读取16位.raw文件Vc++(Wince 平台)
- MongoDB C++ 驱动程序 - 8 位和 16 位整数?
- 使用 OpenCV 和 C++将 16 位灰度图像更改为彩色图像
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- OpenCV 实感 16 位深度图像
- 有没有办法让32位C 编译器遵循16位整数促销规则
- 如何将 16 位无符号 int 转换为 8 位无符号字符并最终返回无符号字符*?
- 为什么16位编译器会给未知的char []声明提供错误
- 如何将图像中的每个像素作为16位索引存储到颜色表中