TIFF文件

Posted Liang-ml

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TIFF文件相关的知识,希望对你有一定的参考价值。

1. 什么是TIFF文件

TIFF (Tagged Image File Format) 标记图像文件格式,以tif或tiff为扩展名,通常由四部分组成,分别为:文件头信息区(IFH)、图像文件目录(IFD)、目录项(DE)和图像数据。

 

                

图像文件头信息区(IFH)

在每一个TIFF文件中第一个数据结构称为图像文件头或IFH (Image File Header),它是图像文件体系结构的最高层,位于文件的开始部分,这个位置是唯一的、固定的,包含着文件其他部分所需的必要信息。

图像文件目录(IFD)

IFD (Image File Directory)是TIFF文件的第2个数据结构,是一个名为标记 (tag) 的用于区分一个或多个可变长度数据块的表,tag中包含了有关图像的所有信息。

由于一个TIFF文件可以有多个图像,而一个IFD只标识一个图像的所有属性,故一个TIFF文件有几个图像就有几个IFD

IFD提供了一系列的指针,这些指针指向各种数据字段在文件中的起始位置,并给出每个字段的数据类型和长度,该方法允许数据字段定义在文件的任何地方,且可以为任意长度,因此文件格式十分灵活。

目录项(DE)

Byte 0-1: tag, 即该属性的标签编号,在文件目录中按升序排列

Byte 2-3: 数据类型

Byte 4-7: 数量,确定存储此tag的数据需要占据的字节数

Byte 8-11: 如果占用的字节数少于4,则数据直接存在此处,大于4则存放指向数据的指针

图像数据(Value)

根据IFD指向的地址,存储图像的具体信息。

TIFF的可扩展性很强,如jpeg、lossless jpeg以及任意数据宽度的原始无压缩数据都可以方便的嵌入到TIFF中去,对图像信息的存放灵活多变,能够使图像包含丰富的各类信息,所以在遥感、医学等数字影像领域都获得了广泛的应用。

2. Python与tiff

2.1 tiff文件的读取

tiff图像的编码格式为16bit, 使用python读取tiff图像通常有两种方法,一种是使用opencv进行读取,如下

import cv2

img = cv2.imread(\'img.tif\', -1)     # -1为保留图像原始格式读取,其余会将图像的编码格式转为8bit
print(img.dtype)

>> uint16

另一种方法为使用tifffile库进行读取,如下

import tifffile as tiff

a = tiff.imread(\'img.tif\')

2.1 tiff文件的保存

可以使用tifffile库中TiffWriter将任意 numpy array保存为tiff文件

TiffWriter是一个将Numpy array转成tiff文件的类,初始化如下

from tifffile import TiffWriter
import cv2
import numpy as np

img = cv2.imread(img_path)
writer = TiffWriter(file,
                    bigtiff = False,
                    byteorder = None,
                    append = False,
                    imagej = False,
                    ome = None)

file : 文件的保存路径
bigtiff : bool  当创建的文件大于4GB时使用True
byteorder : \'<\', \'>\', \'=\', \'/\'  系统的字节顺序,默认就行
append : bool 如果设置为True并且file是一个现有的标准tiff文件,则会将 
              图片数据和tag添加到文件中
imagej : bool 理论上和下面那个我用不到,默认就完事了 
ome : bool 

初始化之后就可以将需要转化的图像使用write函数进行保存了

img_writer.write(data,
                 photometric = \'rgb\',
                 compression = \'jpeg\',
                 planarconfig = \'CONTIG\',
                 tile = (256,256),
                 subsampling = (1, 1),
                 subfiletype = 9)

# write里的参数实在是太多了,详见源码
data : numpy.ndarray
photometric : MINSBLACK, MINSWHITE, RGB, PALETTE, SEPARATED, CFA
compression : str, (str, int), (str, int, dict)
              如果默认或None,数据写入不压缩
              如果是一个str,可写为\'JPEG\'\'ZSTD\'
              如果是一个元组,str同上,第二项是压缩级别,第三项字典是传递给压缩编解码器的参数
planarconfig : \'CONTIG\', \'SEPARATE\'
               CONTIG:最后一个维度包含的样本
               SEPARATE:第三或第四个最后维度包含的样本
tile : tuple或int  
       要写入的图像块的形状,感觉应该是输入的图像块序列大小,然后拼 
       接成最终图像的感觉,长宽必须是16的倍数
subsampling : (1, 1), (2, 1), (2, 2), (4, 1) 二次采样
              默认为(2, 2), 只是哦那个与RGB图像的JPEG压缩          
subfiletype : int
              如果图像是另一个图像的降低分辨率版本,则设置为0
              如果图像是多页图像的一部分,则设置为1
              如果图像是透明蒙版的另一个图像,则设置为2

 

将颜色校准数据写入 TIFF 或 PNG 文件

【中文标题】将颜色校准数据写入 TIFF 或 PNG 文件【英文标题】:Writing Color Calibration Data to a TIFF or PNG file 【发布时间】:2010-09-13 22:19:58 【问题描述】:

我的自定义自制摄影处理软件,在 64 位 Linux/GNU 上运行,可写出 PNG 和 TIFF 文件。这些将被送到高质量的印刷厂制作成精美的艺术品。与室内设计师合作 - 让颜色恰到好处很重要!

印刷店通常不会遇到由商业软件(如 Photoshop)制作的 TIFF 和 PNG。尽管我手头有 TIFF 6.0 规范、PNG 规范和其他信息,但仍不清楚如何在 linux 上包含颜色校准数据或实现颜色管理系统。我的文件经常因为错误而被拒绝,没有足够的错误报告来进行修复。

对于许多人来说,这一直是一个令人讨厌的问题。甚至我在好莱坞后期制作工作室的联系人也在为这个问题而苦苦挣扎。一个工作室甚至想聘请我来负责他们的色彩校准,认为我是专家 - 但不,我和每个人一样盲目和迷茫!

有没有人知道好的代码示例,详细的技术资料,或者有什么其他的启示?或者是时候改用纯苹果了?

【问题讨论】:

【参考方案1】:

看看 LittleCMS

http://www.littlecms.com/

此页面有将其应用于 TIFF 的代码

http://www.littlecms.com/newutils.htm

您需要了解的基本信息是颜色配置文件数据是您需要存储在文件本身的元数据中的东西。

【讨论】:

【参考方案2】:

有一位名叫Charles Poynton 的顾问专门从事这方面的工作。我在你提到的一个后期制作工作室工作(尽管在伦敦而不是在好莱坞),并且看过他几次关于这个主题的演讲。他的网站包含他提供的大量材料,您可能会在那里找到一些有用的东西。他还有一本名为Digital Video and HDTV Algorithms and Interfaces 的书,并没有标题所暗示的那么重!虽然这些资源可能无法直接回答您的问题,但它可能会为其他解决方案提供跳板。

更具体地说,您使用哪些库来编写 png 和 tif 文件 - 您提到它们是自制软件,但它们究竟有多定制?在图像处理程序(例如ImageMagick 或dcraw)中对图像进行后处理可能会让您更成功地将这些信息注入到标头中。

抱歉,我没有任何具体的答案,但也许可以为您指明正确的方向……

【讨论】:

【参考方案3】:

作为 GNU/Linux 用户,您将需要考虑 DispcalGUI – http://dispcalgui.hoech.net/ – 基于 GNOME 的 GUI,它集中了色彩管理、ICC 配置文件管理和(对您的情况至关重要)设备校准。它可以与知名的专业和中级硬件通信,例如 i1、X-Rite、Spyder 等。

但在你开始之前——你说你正在生成你的文件来规范;您是否使用特定于相关格式的测试套件来验证您的输出?如果没有,这里有三个可以帮助您入门:

    imagetestsuite 支持众所周知的格式:https://code.google.com/p/imagetestsuite/w/list?can=1&q=

    Luminous* 测试套件是一个 JIRA 插件,如果您愿意的话:https://marketplace.atlassian.com/plugins/com.luminouslead.plugin.jira.testsuite.LuminousTestSuite

    FLOSS 解码器实现通常有一个您可以使用的,即 OpenJPEG – https://code.google.com/p/openjpeg/wiki/TestSuiteDocumentation

但即使排除所有这些,您的问题似乎出在 嵌入式 ICC 数据 - 这是两个规格合二为一。首先,有宿主图像文件格式,它们处理嵌入的方式都不同(这意味着嵌入 TIFF 中的 ICC 数据可能看起来与 JPEG 或 WebP 文件完全不同)。其次,有 ICC 规范本身。它在此处记录:http://color.org/v4spec.xalter - 您可能还想查看上述 dispcalGUI 的源代码,其中包括 Python 中非常清晰和可破解的 ICC 配置文件类:http://sourceforge.net/p/dispcalgui/code/HEAD/tree/trunk/dispcalGUI/ICCProfile.py

完全披露:I have contributed 指向那个非常 ICC 配置文件类,我刚刚在最后一个链接中链接到它 ¶

这就是基础知识(其中许多你无疑已经涵盖)......除此之外,如果你发布更多关于究竟出了什么问题的信息,我很想看看它。不管怎样,祝你好运。

* 注意。本项目与老牌摄影网站“the Luminous Landscape”无关

【讨论】:

以上是关于TIFF文件的主要内容,如果未能解决你的问题,请参考以下文章

tiff文件读取

使用 gdal 重新投影 .tiff 文件

tiff和geotiff格式分析

将颜色校准数据写入 TIFF 或 PNG 文件

如何将 tiff 图像保存到新的 npy 文件中?

使用 ghostscript 将 PDF 转换为 TIFF 但不将文件写入磁盘