image-processing - 如何检查 TIFF 文件是否真正具有 16 位深度
问题描述
假设我使用以下 ImageMagick 命令将 8 位 TIFF 图像转换为 16 位:
$ convert 8bit-image.tif -depth 16 16bit-image.tif
结果是一个文件被其他程序检测为具有 16 位深度的文件:
$ identify 16bit-image.tif
16bit-image.tif TIFF 740x573 740x573+0+0 16-bit sRGB 376950B 0.000u 0:00.000
自然地,这个文件没有“真正的”16 位,因为它是一个 8 位文件,只是简单地标记为 16 位。它没有真正的 16 位所期望的细微差别。如何区分真正的 16 位图像和只是“假装”的图像?
最好的,
贝拉
解决方案
当你有一个 8 位图像时,像素值的范围是 0 到 255。对于 16 位图像,像素范围是 0 到 65535。所以你可以在 16 位中表达比在 8 位中更多的细微差别。
通常,当您的相机中有一个 16 位成像器时,它能够捕捉这些细微差别并将它们映射到完整的 16 位范围。8 位成像器将被限制在更小的范围内,因此与 16 位成像器相比,在拍照时会丢失一些信息。
现在,当您开始使用 8 位图像时,该信息已经丢失,因此转换为 16 位不会给您带来更大的细微差别,因为 ImageMagick 无法在没有信息的地方创造信息。
图像处理工具通常所做的是将 8 位图像的像素值填充复制到 16 位图像中,因此您的 16 位图像仍将仅包含 [0,255] 范围内的值。如果在您的示例中是这种情况,您可以检查 16 位图像的最亮像素是否大于 255。如果是,您可以假设它是原生 16 位图像。如果不是,它很可能是从 8 位转换而来的。
但是,不能保证 16 位图像真的是从 8 位转换而来的,因为它可能只是一个非常暗的原生 16 位图像,只是偶然使用了 8 位范围中最暗的像素。
编辑:有人可能使用完整的 16 位范围将 8 位图像转换为 16 位。这可能意味着值 0 的像素可能保持在 0,255 的像素现在可能处于 65535,并且其间的所有值将均匀分布到 16 位范围。
但是,由于无法发明新信息,因此所使用的像素值会存在间隙,例如,您的像素值可能为 0、255、510 等,但不会出现介于两者之间的值。
根据用于拉伸像素范围的算法,这些特定值可能会有所不同,但您可以通过查看图像的直方图来发现类似的转换:
它将具有独特的梳状结构(图片取自http://www.northlight-images.co.uk/digital-black-and-white-working-in-16-bit/)
因此,根据从 8 位到 16 位的转换是如何执行的,判断它是否是原生图像可能会有点复杂,即使这样也不能保证可靠地确定图像是否实际转换。
推荐阅读
- amazon-s3 - 来自 S3 的 Apache Flink 有状态读取文件
- java - (Sublime Text 3) bash: javac: command not found
- sorting - 按布尔值对对象列表进行排序
- apache-kafka - Spring Cloud Stream 以编程方式创建和删除主题
- swiftui - 具有多列的 SwiftUI 列表
- javascript - 离线使用引导程序(通过 npm)时,我是否必须为 slideToggle 动画创建和使用我自己的 jquery 脚本?
- ios - 使用 arrayWithObject 将对象添加到 NSMutableArray
- reactjs - Deck.gl 全球建议
- r - 数据框列:在这种情况下如何使用循环?
- javascript - 在 django (for) 中访问元素