【问题标题】:Writing 10,12 bit TIFF files with LibTIFF C++使用 LibTIFF C++ 编写 10,12 位 TIFF 文件
【发布时间】:2011-08-15 17:15:48
【问题描述】:

我正在尝试使用 LibTIFF 编写 10,12 位 RGB TIFF 文件。

像素数据本地保存在unsigned short缓冲区(16位)中

1) 如果我将TIFFTAG_BITSPERSAMPLE 设置为 10 或 12,则从缓冲区中读取的位不足,并且输出不正确。 (我知道它只是读取每个组件 10 或 12 位,而不是 16 位,这就是问题所在)

2) 我尝试将这些位打包到缓冲区中,这样它实际上是 12-R、12-G、12-B。在这种情况下,我认为文件写入正确,但我找不到任何查看器可以正确显示此图像。

3)如果我将TIFFTAG_BITSPERSAMPLE设置为16,观众可以显示TIFF图像,但是我有一个问题,我不知道图像最初是10位还是12位(如果我想稍后读取它与 LibTIFF)。此外,观看者希望动态范围为 16 位,而不是 10 或 12 位,这也会导致观看效果不佳。

4) 最烦人的部分是我在网上找不到一张 10、12 或 14 位 TIFF 图像来查看标题应该是什么样子。

最后,将 10 位或 12 位图像数据写入 TIFF 文件的正确方法是什么????

【问题讨论】:

  • 我前段时间问过同样的问题,没有结果,看来tiff格式没有这个标签。我希望我错了……

标签: c++ tiff libtiff


【解决方案1】:

The TIFF specification 没有指定在图像中每个通道存储 10、12 或 14 位的方式。根据编码器和解码器的不同,可能仍然可以处理此类图像,但这实际上是一个实现细节,因为它们不需要这样做。

如果您希望 TIFF 中的精度超过 8 位,则唯一的选择是 16(或浮点,但那是另一回事)。

我不知道有任何图像格式支持这些位深度,因此如果您必须存储具有该特定位深度的图像,无论如何查看器都可能是个问题。我能想到的最简单的解决方法是将原始位深度存储为每像素 16 位并将原始位深度作为元数据(例如在 ImageDescription 标记中),但这完全取决于图像的用途以及您需要此信息的原因.

【讨论】:

  • 其实我也推荐这个作为解决方案,因为奇异的位深度不会给你带来任何好处。
  • 我使用每个样本 16 位并将实际位深度编码为元数据。谢谢
  • 我想指向 TIFF 标签 MAXSAMPLEVALUE 和 MINSAMPLEVALUE,它们可以设置(至少使用 tifflib)并给出一些可能的值范围,这些值可以被某些查看器(例如 ImageJ)解释。跨度>
【解决方案2】:

您可以将图像存储为多图像文件。例如,对于 12 位源,一个图像将是使用高 8 位和第二个 16 位灰度的 RGB(8) 图像,后者是低四位和四位填充的组合。这提供了一个可以在带有标准程序的监视器上查看的 TIFF,并且可以使用自定义软件检索额外的精度。

我不同意“异国情调”位深度不好。这种格式会将图像大小减小 5/6。您甚至可以将第二张图像存储为 重新缩放 版本,该版本将 4 位紧密打包而无需填充以减小 3/4 大小。对于非常大的数据集,这种节省可能非常显着,由于数据的性质,压缩不是一种选择。即,许多科学和机器视觉应用可能需要未掺杂的比特。从多图像 tiff 转换为 16 位 tiff 的能力将允许使用标准程序和图像库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多