灰度图像的 BMP 格式是什么(尤其是每像素 16 位)?维基百科只讨论 bmp 的彩色图像。
更新:
只是为了将来访问者的更新和信息,我会选择PGM,因为它是未压缩的并且可以支持 16 位灰度。另一种选择是使用PNG,但它会压缩数据(这不是我想要的),如此处所述。另请注意,图像可能会出现失真,因为大多数显示器支持 256 色而不是 16 位的 4096。所以图像会饱和。
令人惊讶的是,对于 16 位图像的灰度,BMP几乎无能为力。
感谢帮助我理解问题的人。
对于灰度图像,我会使用 8 位 BMP。8 位 BMP 可以使用调色板对颜色进行编码。但是,如果您不使用一个,您可以简单地将颜色值解释[0...255]
为从黑色 (0) 到白色 (255) 的颜色。
编辑:我不会将 BMP 用于 16 位灰度图像。从技术上讲,您可以使用每像素 16 位 BMP 格式来编码 16 位灰度数据 ( http://en.wikipedia.org/wiki/BMP_file_format#Pixel_format )。然而在实践中,这是一个坏主意(阅读:hacky),因为该深度旨在对像素的 alpha、红色、绿色和蓝色样本进行编码。
存储每像素 16 位灰度数据的更好格式是 PNG。
还要问问自己,你真的、真的需要那种额外的精度吗?对于大多数应用程序,每像素 8 位就可以了(=如果您对精度没有任何特定要求,那就是这种情况)。
你是对的,BMP 只知道颜色。这样做的方法是创建一个包含 256 个条目的调色板,其中每个条目具有相同的 R、G、B 值:第一个条目 (0,0,0),第二个条目 (1,1,1) 等。现在使用调色板使图像每像素 8 位。
编辑:鉴于您对 16 位灰度的新要求,我认为您有 2 个选择:转换为 8 位,或使用 BMP 以外的其他格式。如果转换为 8 位,则可以使用抖动来生成与源 16 位图像在视觉上无法区分的结果。
看起来,TIFF 和 PNG 本身就支持 16 位灰度。
http://en.wikipedia.org/wiki/Grayscale
我假设您希望保存的这些图像不仅仅是为了显示,而是为了某种需要额外精度的后期处理?如果不是,那么我建议删除最低有效 8 位,并使用颜色图存储一个更简单的 8 位位图,以将每个值映射到具有 value -> (value, value, value) RGB 映射的 RGB。
灰度图像的 BMP 格式是什么
除了使用调色板之外,您还可以通过编写带有BITMAPV4HEADER
. 并将bV4RedMask
,bV4GreenMask
和设置bV4BlueMask
为相同的值。但是,bcBitCount
这种格式的最小值是 16,因此每个像素仍然需要占用两个字节。不过,您可以将第二个字节用于 Alpha 通道(透明度)。
特别是对于每像素 16 位
看起来任何 BMP 版本都不支持 16 位色深。即使文件格式似乎允许它(bcBitCount=16
和bV4…Mask=0xFFFF
),图像编辑器和库也会丢弃额外的位。
一些文档引用了 64-BPP BMP 文件,但不清楚这将如何与BITMAPV4HEADER
字段匹配,因为掩码字段的大小都是 32 位(因此无法为 64 BPP 指定通道掩码)。
另一种选择是使用 PNG,但它会压缩数据(这不是我想要的),如此处所述。
如果您不想压缩 PNG 文件,则不必压缩。使用 0 的压缩级别将使像素保持原样(加上 zlib 页眉/页脚)。
另请注意,图像可能会出现失真,因为大多数显示器支持 256 色而不是 16 位的 4096。
16 位深度将允许 65536 个不同的每通道亮度值,而不是 4096。失真听起来像是伽马曲线的问题,并且与文件格式问题没有真正的关系。