Matlab写TIFF格式文件(多于3波段)

2023-05-16

1、起因
通常情况下,使用MATLAB做图像处理后,使用下面的命令就可以保存处理结果为图片。

imwrite(im,'im.bmp');

而如果需要保存的图像为single或者double类型,或保存的图像超过RGB三个通道时,则不能使用imwrite来直接进行,此时需要将矩阵保存为TIFF格式的图片。

matlab支持LibTIFF库作为TIFF图像读写的工具,因此只要学习如果使用LibTIFF提供的matlab接口就可以完成TIFF图像的读写任务。

使用TIFF保存图像时使用的详细的TAG信息非常的多,也很复杂,这里不做过多详细的说明,仅做出通常使用的示范。若想要更多的了解请阅读 Tiff online文档。

2、基本操作范例
首先介绍TIFF影像的保存。

1、待保存的影像矩阵

% ··· 预处理得到待保存的影像: im
2、通过构建一个Tiff对象生成待读取的影像,通过第二个参数表示写(‘w’)和添加(‘a’)模式

t = Tiff('myfile.tif','w');

TIFF影像通过IFD(Image File Directory)组织一幅影像的数据和元数据。具体说明如下:

When you create a new TIFF file, the Tiff constructor creates a file containing an image file directory (IFD). A TIFF file uses this IFD to organize all the data and metadata associated with a particular image. A TIFF file can contain multiple IFDs. The Tiff object makes the IFD it creates the current IFD. Tiff object methods operate on the current IFD. You can navigate among IFDs in a TIFF file and specify which IFD is the current IFD using Tiff object methods.

3.设置TIFF tags这里相当于设置图片的头文件信息,方法是给tagstruct对象赋值。这里比较关键也是容易出错的地方

% 影像大小信息(这两项比较简单)
tagstruct.ImageLength = size(im,1) % 影像的长度
tagstruct.ImageWidth = size(im,2)  % 影像的宽度

% 颜色空间解释方式,详细见下文
tagstruct.Photometric = 1

% 每个像素的数值位数,single为单精度浮点型,对于32为系统为32
tagstruct.BitsPerSample = 32
% 每个像素的波段个数,一般图像为1或3,但是对于遥感影像存在多个波段所以常常大于3
tagstruct.SamplesPerPixel = 4
tagstruct.RowsPerStrip = 16
tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky
% 表示生成影像的软件
tagstruct.Software = 'MATLAB'; 
% 表示对数据类型的解释
tagstruct.SampleFormat = 3
% 设置Tiff对象的tag
t.setTag(tagstruct)
% 已准备好头文件,开始写数据

t.write(t);
% 关闭影像
t.close

3、tagstruct详解
设置tagsstruct是保存TIFF格式影像比较麻烦的问题,一些tagsstruct比较直观,还有一些需要更进一步的了解才能正确设置,否则就无法正确使用TIFF格式,下面将详细介绍比较麻烦的几个tag。

3.1、Photometric Interpretation (颜色空间解译方式)
取值(前面几项比较常用,后面表示不同的颜色空间,根据需要取用):

PHOTOMETRIC_MINISWHITE = 0;  % 最小值表示白色
PHOTOMETRIC_MINISBLACK = 1;  % 最小值表示黑色
PHOTOMETRIC_RGB = 2;         % RGB
PHOTOMETRIC_PALETTE = 3;     % 颜色表
PHOTOMETRIC_MASK = 4;        % 包含透明通道
PHOTOMETRIC_SEPARATED = 5;
PHOTOMETRIC_YCBCR = 6;
PHOTOMETRIC_CIELAB = 8;
PHOTOMETRIC_ICCLAB = 9;
PHOTOMETRIC_ITULAB = 10;
PHOTOMETRIC_LOGL = 32844;
PHOTOMETRIC_LOGLUV = 32845;

3.2、RowsPerStrip
IFD Image 
Code 278 (hex 0x0116) 
Name RowsPerStrip 
LibTiff name TIFFTAG_ROWSPERSTRIP 
Type SHORT or LONG 
Count 1 
Default 2**32 - 1 
Description

The number of rows per strip. (每个strip包含的row个数。)TIFF影像可以通过组织strip来满足快速的随机访问和高效的I/O缓存。

RowsPerStrip and ImageLength 两个参数确定了整幅影像的strips个数,公式如下:

StripsPerImage = floor ((ImageLength + RowsPerStrip - 1) / RowsPerStrip).

StripsPerImage 不是一个属性,它仅仅是一个TIFF读取时可能需要使用到的值,因为它确定了影像的StripOffsets 和StripByteCounts值。

3.3、Sample Format (每个像素数值的解译方式)
SampleFormat 
Tag = 339 (153.H) 
Type = SHORT 
N = SamplesPerPixel

可能的取值: 
1 = unsigned integer data 
2 = two’s complement signed integer data 
3 = IEEE floating point data [IEEE] 当我们保存single类型数据的时候使用的就是这个值 
4 = undefined data format

扩展值:

5 = Seperated, usually CMYK. 
6 = YCbCr 
8 = CIE L*a*b* (see also specification supplements 1 and 2) 
9 = CIE L*a*b*, alternate encoding also known as ICC L*a*b* (see also specification supplements 1 and 2)

The TIFF-F specification (RFC 2301) defines:

10 = CIE L*a*b*, alternate encoding also known as ITU L*a*b*, defined in ITU-T Rec. T.42, used in the TIFF-F and TIFF-FX standard (RFC 2301). The Decode tag, if present, holds information about this particular CIE L*a*b* encoding.

The DNG specification adds these definitions:

32803 = CFA (Color Filter Array) 
34892 = LinearRaw

需要注意的是: 
SampleFormat 字段确定的是数据的类型(枚举值),而不是每个像素的大小,像素大小由BitsPerSample字段确定。SampleFormat默认取值为1。

小结
除了上面部分介绍的tags以外,还有其他tags此处并未做介绍,使用上面的信息已经可以满足最基本的存储要求,然而如果需要对影像进行压缩或做进一步处理的话,需要更多的了解TIFF关于压缩方面的设置。总之,TIFF影像的保存操作主要是设置正确的tags得到结果,所以如果需要进一步的拓展,可以查阅下面的链接,进一步了解。

参考链接:
Matlab: Exporting to Images
LibTIFF - TIFF Library and Utilities
TIFF Tag PhotometricInterpretation
TIFF Tag RowsPerStrip
Tiff online文档
--------------------- 
修改自:https://blog.csdn.net/angelazy/article/details/50465058 
作者:张小小Angela 
来源:CSDN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab写TIFF格式文件(多于3波段) 的相关文章

  • 连接每第 n 行

    我在矩阵中得到了一个数据集 如下所示 从 Excel 导入 matrix Cat1 1 2 3 4 Cat2 9 10 11 12 Cat3 17 18 19 20 Cat1 5 6 7 8 Cat2 13 14 15 16 Cat3 21
  • Octave/Matlab:向向量添加新元素

    有一个向量x我必须添加一个元素 newElem 有什么区别吗 x end 1 newElem and x x newElem x end 1 newElem更稳健一些 x x newElem 仅当x是行向量 如果它是列向量x x newEl
  • SPMD 与 Parfor

    我对 matlab 中的并行计算很陌生 我有一个创建分类器 SVM 的函数 我想用几个数据集来测试它 我有一个 2 核工作站 所以我想并行运行测试 有人可以向我解释一下以下之间的区别 dataset array dataset1 datas
  • 使用 sprintf 打印元素数量可变的向量

    在下面的代码中 我可以打印向量中的所有元素item用空格分隔为 item 123 456 789 sprintf d d d item ans 123 456 789 我怎样才能做到这一点而不必输入那么多 d作为元素的数量item 最简单的
  • MATLAB 颜色条刻度标记错误?

    我正在绘制 9 个子图 如下图所示 其中一个颜色条代表三个子图 在这里我想将颜色条中的最高值显示为 gt value 令人惊讶的是 当我手动将刻度标签编辑为h TickLabels end gt h TickLabels end 颜色条开始
  • Windows 上 Matlab 64 位版本的免费 SCM [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当 Matlab 安装为 64 位版本时 它只能使用 64 位源代码控制系统 是否有免费的源代码控制系统
  • 如何绘制 NxN 圆数组?

    我想绘制一个 NxN 的圆数组 为了形象化 我附上了我想要实现的目标的图像 我是 MatlLab 的新手 所以我尝试先绘制一个圆 下面是示例代码 n 2 10 size of mask M zeros n I 1 n x I n 2 mas
  • 当 MATLAB 发生错误时如何继续循环?

    我正在使用函数将一些 dat 文件转换为 mat 文件 我在循环内调用此函数来转换多个文件 在某些情况下 我的 dat 文件已损坏 函数无法转换并发生错误 从而停止循环 现在我的问题是 是否有任何命令 当错误发生时 它应该跳过循环中的当前
  • Matlab,如何获取imagesc生成的结果?

    我读过一些类似的文章 但它们不是我想要的 得到imagesc之后的矩阵 https stackoverflow com questions 14364239 get the matrix after imagesc 14364434 143
  • 读取 MEX 文件中的 4D 数组

    我在 MATLAB 中有一个 4 维数组 我正在尝试访问 MEX 函数中的数组 下面创建 testmatrix 一个 4 维矩阵 已知数据为uint8 type Create a 4D array 2x 2y rgb 3 framenumb
  • MATLAB 引擎函数的输入参数

    我正在尝试使用 MATLAB 引擎在 Python 中调用 MATLAB 函数 但遇到一些问题 在设法将 NumPy 数组作为函数的输入处理后 现在 MATLAB 出现一些错误 MatlabExecutionError 未定义输入函数 si
  • 在 MATLAB 中绘制圆

    我被要求找到在 MATLAB 中绘制圆的不同方法 看起来很无聊 不过我可以想出一些想法 有些可能效率低下 Method 1 ezpolar x 1 Method 2 t linspace 0 2 pi 100 plot sin t cos
  • Google Chrome 的互联网历史记录脚本

    我并不是在寻找 最佳 或最有效的脚本来执行此操作 但我想知道是否存在一个脚本可以从 Google Chrome 中提取一天的互联网历史记录并将其记录到 txt 文件中 我更喜欢用 Python 或 MATLAB 编写 如果你们有不同的方法
  • Matlab 中二维插值的函数形式

    我需要从二维数据数组构造一个插值函数 我需要返回实际函数的东西的原因是 我需要能够将函数作为我需要进行数值积分的表达式的一部分进行计算 因此 interp2 并没有解决这个问题 它不返回函数 我可以使用 TriScatteredInterp
  • 如何在matlab中绘制彩色一维直方图

    我有一个一维数组 X 其中包含相关系数的统计数据 我想绘制一个彩色直方图 我使用以下代码 histogram X 10 它可以创建具有单色的直方图 现在我想绘制一个直方图 其中每个条形都有不同的颜色 但 FaceColor 选项只能调整整个
  • 在 C# 中快速加载/读取 TIFF 文件

    我正在编写一个处理 TIFF 图像的 C 应用程序 主要是显示文件 重新排序页面 删除页面 分割多页图像 将单个图像合并为一个多页图像等 我们处理的大多数图像都较小 无论是文件大小还是页码 但也有一些较大的图像 显示图像时 我们需要将多页
  • 与超类和子类构造函数接口

    我在 matlab 文档和之前有关使用 matlab 继承和类构造函数创建接口的问题中找不到帮助 为了使其整洁 放在一个包内 我可以将其压缩如下 而不是拖拽代码 一套 MyPkg有一个超类Super和一些子类Sub1 Sub2 我的大多数属
  • MATLAB 链表

    有哪些可能的方法来实现链表MATLAB http en wikipedia org wiki MATLAB 注意 我问这个问题是为了教学价值 而不是实用价值 我意识到 如果您实际上在 MATLAB 中滚动自己的链表 那么您可能做错了什么 然
  • 使用 varargin (...) 时如何显示不同的函数用法?

    当您输入 Matlab 函数名称并打开大括号时 例如sum 在命令窗口中 将打开一个工具提示 显示此函数的所有可能用法 当我编写自己的接受函数时varargin 工具提示仅显示一个选项 而不是varargin puts e g myfunc
  • Matlab 的快速 JSON 解析器

    您知道 Matlab 中有一个非常快速的 JSON 解析器吗 目前我正在使用JSONlab http www mathworks com matlabcentral fileexchange 33381 jsonlab a toolbox

随机推荐

  • Mark 概率图模型PGM和马尔科夫随机场MRF

    待续 概率图模型 xff08 PGM xff09 有必要系统地学习一下吗 xff1f PGM学习之七 MRF xff0c 马尔科夫随机场
  • cmd下文件md5查看插件

    文件md5可以帮助我们检测文件是否被篡改或者比较两个文件是否含有完全相同的内容 xff0c 在linux及mac系统之中 xff0c 都可以在终端窗口使用md5命令查看指定文件的md5值 xff0c 然而在微软window系统的cmd下却没
  • PowerShell: 如何解决File **.ps1 cannot be loaded because the execution of scripts is disabled on this sy

    转自 xff1a http www cnblogs com findcaiyzh archive 2012 09 21 2696282 html PowerShell 默认不允许执行 ps1脚本文件 运行ps1文件会得到下面的错误 File
  • JavaScript入门教程链接

    看到一些适合JavaScript初学者的一些入门教程记录下 xff0c 初级教程基本都是介绍语法的 xff0c 学习JS时最好能够结合HTML CSS和WEB开发的概念一起学习会理解比较深 中文教程有 xff1a W3school的JS教程
  • .NET Arrary OutOfMemoryException

    在 NET中如果数组大小超过2GB xff0c 会遇到错误 xff1a OutOfMemoryException Array dimensions exceeded supported range 此时可以通过修改App config中设置
  • Get help of python and python package function/获取python及python包函数的帮助文档

    摘要 xff1a 快速获取函数的帮助文档是阅读陌生程序的需求 xff0c 也是学习编程语言的有效方法 对于python和python包 xff0c 均有这样的支持 这里以numpy为例 xff0c 说明其获取帮助的方法 xff0c 其一使用
  • Python Numpy Tutorial / Python Numpy 教程 (矩阵和图像操作)

    Python Numpy教程介绍了Python基础 Python Numpy的矩阵和矩阵运算 SciPy的图像读写处理函数 matplotlib的绘图和图像显示 xff08 plot和imshow xff09 等 这些都是深度学习中对于矩阵
  • Python获取当前路径

    Refs https blog csdn net qq 15188017 article details 53991216 假设py文件路径为 F SEG myResearch myProject 2 test py Method 1 sy
  • Matlab去除二值图像小对象 bwareaopen

    From https ww2 mathworks cn help images ref bwareaopen html bwareaopen Remove small objects from binary image collapse a
  • 百度地图POI数据获取

    转载自 xff1a https blog csdn net baidu 26646129 article details 80464447 本文主要介绍百度地图POI数据获取 xff1a 从百度地图得到POI数据 xff0c 以json格式
  • 遥感影像降位16位到8位

    From https blog csdn net shenshanxiaozhu article details 53224554 常用卫星影像基本上都是16位影像 xff0c 在某些应用场景下需要将16位影像降到8位影像 xff0c 这样
  • ipython notebook 如何打开.ipynb文件?

    三种方法查看 ipynb 文件 xff1a 1 xff0c GitHub 中可以直接打开 ipynb 文件 2 xff0c 可以把 ipynb 文件对应的下载链接复制到 https nbviewer jupyter org 中查看 3 xf
  • 解析IOS二进制格式的bplist

    关于二进制格式的plist xff0c 搜到一篇博客 详解Binary Plist格式 xff0c 介绍的很详细 xff0c 但是结合github上关于一份解析bplist的代码通过结果实际来看 xff0c 博客中解析对象表的说明出现了问题
  • 'gbk' codec can't encode character解决方法

    Friom https www cnblogs com themost p 6603409 html 使用Python写文件的时候 xff0c 或者将网络数据流写入到本地文件的时候 xff0c 大部分情况下会遇到 xff1a Unicode
  • Python中str与bytes互相转换

    快速转换方式 str to bytes my str 61 34 hello world 34 my str as bytes 61 str encode my str type my str as bytes ensure it is b
  • Python关于%matplotlib inline

    在github代码中经常会看到这样的代码 xff1a import numpy import matplotlib pyplot as plt from pandas import read csv import math from ker
  • Jupyter Notebook介绍、安装及使用教程

    目录 一 什么是Jupyter Notebook xff1f 1 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序 其可被应用于全过程计算 xff1a 开发 文档编写 运行代码和展示结果 Jupyter Notebo
  • Python读取XML

    From http www cnblogs com fnng p 3581433 html 关于python读取xml文章很多 xff0c 但大多文章都是贴一个xml文件 xff0c 然后再贴个处理文件的代码 这样并不利于初学者的学习 xf
  • matlab解决中文显示乱码

    matlab很多函数在读取中文后显示乱码 xff0c 为了显示中文 xff0c 应改为UTF 8方式或其他支持中文的编码方式 xff0c 这在Matlab中的操作为 xff1a slCharacterEncoding 39 UTF 8 39
  • Matlab写TIFF格式文件(多于3波段)

    1 起因 通常情况下 xff0c 使用MATLAB做图像处理后 xff0c 使用下面的命令就可以保存处理结果为图片 imwrite im 39 im bmp 39 而如果需要保存的图像为single或者double类型 xff0c 或保存的