首页 > 其他分享 >TIFF文件

TIFF文件

时间:2023-06-01 09:01:13浏览次数:36  
标签:文件 img TIFF tiff IFD 图像

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

 

标签:文件,img,TIFF,tiff,IFD,图像
From: https://www.cnblogs.com/Liang-ml/p/17445238.html

相关文章

  • Redis 配置文件的详解
    1.Redis配置文件的位置在linux操作系统中,安装了Redis后,Redis的配置文件位于Redis安装目录下,文件名为redis.conf(例如:Ubuntuapt命令安装,则配置文件位于/etc/redis/redis.conf)。Redis启动时会加载这个配置文件,在运行时按照配置进行工作。网络上的redis.conf配置文......
  • Redis配置文件
    一、Units单位配置大小单位,开头定义了一些基本度量单位,只支持byte,不支持bit,大小写不敏感二、网络配置默认情况下bind=127.0.0.1只能接收本机的访问请求,不写的情况下,无限制接受任何ip地址的访问生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉如......
  • 网安--文件压缩和打包
    打包和压缩的区别打包:多个文件压缩成为一个文件--减少个数压缩:缩小一个文件的体积--减小文件体积不同的概念,可以先打包再压缩。打包和压缩都需要消耗时间打包tar命令-c创建打包文件-v显示详细信息-f指定文件名称,放在选项后面-z压缩或解压缩(.gz)-x解包-C解压缩到指定......
  • IIS短文件名泄露漏洞
    1、windows的短文件名机制(1)介绍为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成了对应的windows8.3短文件名。dir/x列出当前目录的子目录和文件,以及相应的8.3兼容名称(如果有的话)win10,默认是没有开启8.3兼容特性,无法显示短文件名(2)命令fsutilbehavio......
  • c#使用内存映射像处理内存一样去快速处理文件
    在.NETCore中,`System.IO.MemoryMappedFiles.MemoryMappedFile`类提供了对内存映射文件的支持。通过将文件映射到内存,你可以在应用程序中直接访问文件的内容,而不需要显式地进行文件的读取和写入操作。内存映射文件允许你将文件的特定区域映射到内存中的一个或多个`MemoryMap......
  • 文件夹操作日志搜集器
    每当用户执行变更文件夹操作时,LeetCode文件系统都会保存一条日志记录。下面给出对变更操作的说明:"../":移动到当前文件夹的父文件夹。如果已经在主文件夹下,则继续停留在当前文件夹。"./":继续停留在当前文件夹。"x/":移动到名为x的子文件夹中。题目数据保证总是存在文件......
  • Pytest - Fixture(12) - 配置文件conftest.py
    Pytest-配置文件-conftest.py前言如果在多个测试文件中的用到相同的fixture函数,则可以将其移动到conftest.py文件中conftest.py是专门存放fixture的配置文件;例如:如果测试用例都需要进行用户登录的时候,仅需将登录的功能放到conftest.py文件中,而不需要在每个用......
  • Windows通过使用批处理.bat脚本文件修改DNS值
    在公司内网有自己的DNS服务器,但是在使用某些软件时又经常需要特定的DNS地址,每次切换都非常麻烦,所以写了个.bat批处理脚本文件方便切换,如果是修改IP等信息做些修改后同样可以使用。@echooff:startecho1:设置DNS为手动2:设置DNS为自动set/pvar=请选择if%var%==1gotoop......
  • 删除文件夹及其下的文件
    publicvoiddeleteDir(Filedir){try(Stream<Path>walk=Files.walk(dir.toPath())){walk.sorted(Comparator.reverseOrder()).forEach(path->{try{Files.delete(path);......
  • Windows编程:文件监控
    最近在做虚拟打印机时,需要实时监控打印文件的到达,并移动文件到另外的位置。一开始我使用了线程,在线程里去检测新文件的到达。实际上Windows提供了一个文件监控接口函数ReadDIrectoryChangesW。这个函数可以对所有文件操作进行监控。 ReadDirectoryChangesW函数声明1BOOLR......