<转>Matlab读写TIFF格式文件

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)  % 影像的宽度

% 颜色空间解释方式,详细见下文3.1节
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(nmf);
% 关闭影像
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得到结果,所以如果需要进一步的拓展,可以查阅下面的链接,进一步了解。

参考链接:

    1. Matlab: Exporting to Images
    2. LibTIFF - TIFF Library and Utilities
    3. TIFF Tag PhotometricInterpretation
    4. TIFF Tag RowsPerStrip
    5. Tiff online文档

原文地址:https://www.cnblogs.com/lionyiss/p/9552979.html

时间: 2024-11-13 08:09:32

<转>Matlab读写TIFF格式文件的相关文章

matlab读取.mat格式文件

matlab读取.mat格式文件 13.1 数据基本操作 本节介绍基本的数据操作,包括工作区的保存.导入和文件打开.13.1.1 文件的存储 MATLAB支持工作区的保存.用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入.保存工作区可以通过菜单进行,也可以通过命令窗口进行. 1. 保存整个工作区 选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件. 2. 保存工作区中的变量 在工作区浏览

Python怎么读写json格式文件

JSON-是一个轻量级的数据交换格式.点击打开百度百科 JSON维基百科:http://zh.wikipedia.org/wiki/JSON json模块 关于json的官方文档:点击打开链接 本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创.不定期更新,有错误请指正. Sina微博关注:@The_Third_Wave 如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址. d

JAVA用geotools读写shape格式文件

转自:http://toplchx.iteye.com/blog/1335007 JAVA用geotools读写shape格式文件 (对应geotools版本:2.7.2) (后面添加对应geotools 10.0版本的写法) 读shape文件. shape格式文件最少包含3个文件,他们的后缀是:.shp, .dbf, .shx. .shp存储地理形状和位置信息,.dbf存储属性信息,.shx是索引文件. 单独读取DBF文件 public void readDBF(String path) {

使用VS2010调用matlab的mat格式文件

做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来. C++读取mat文件的步骤如下. 1. vs2010的配置 新建一个工程,在属性管理器中选择 工程->属性->VC++目录. 设置包含目录为:D:\MATLAB\R2010a\extern\include(我的matlab装在D盘): 设置库目录为:D:\MATLAB\R2010a\extern\lib\win32\micr

如何用python读写CSV 格式文件

工作中经常会碰到读写CSV文件的情况.记录下,方便自己以后查询并与大家一起分享: 写CSV文件方法一: import csv          #导入CSV with open("D:\egg.csv","wb") as csvfile       #新建一个叫egg.csv"的文件在D盘. a=csv.writer(csvfile)                                    #以CSV的格式 写数据到文件CSVFILE中. a

SpringBatch Sample (四)(固定长格式文件读写)

前篇关于Spring Batch的文章,讲述了Spring Batch 对XML文件的读写操作. 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对固定长格式文件的读写操作.实例延续前面的例子,读取一个含有四个字段的TXT文件(ID,Name,Age,Score),对读取的字段做简单的处理,然后输出到另外一个TXT文件中. 工程结构如下图: applicationContext.xml和log4j.xml前文已经叙述过,在此不做赘述. 本文核心配置文件batch.xml内容如

【原创】开源Math.NET基础数学类库使用(三)C#解析Matlab的mat格式

开源Math.NET系列文章目录: 1.开源.NET基础数学计算组件Math.NET(一)综合介绍  2.开源.NET基础数学计算组件Math.NET(二)矩阵向量计算  3.开源.NET基础数学计算组件Math.NET(三)C#解析Matlab的mat格式 4.开源.NET基础数学类库使用Math.NET(四)C#解析Matrix Marke数据格式 5.开源.NET基础数学类库使用Math.NET(五)C#解析Delimited Formats数据格式 6.开源.NET基础数学类库使用Mat

开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式

原文:[原创]开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式 开源Math.NET基础数学类库使用系列文章总目录:   1.开源.NET基础数学计算组件Math.NET(一)综合介绍   2.开源.NET基础数学计算组件Math.NET(二)矩阵向量计算   3.开源.NET基础数学计算组件Math.NET(三)C#解析Matlab的mat格式   4.开源.NET基础数学类库使用Math.NET(四)C#解析Matrix Marke数据格式   5.开源.NET基

Mac怎么读写NTFS格式?Mac读写NTFS格式硬盘教程

我们都知道NTFS 格式的 Windows 硬盘在Mac OS X系统下只能读取不能写入,这一问题一直困扰着很多新老Mac 用户,一般的的解决办法就是安装 NTFS 插件来让 OS X 支持 NTFS 格式硬盘的写入操作.其实在 OS X 10.9 发布以后,OS X 自身就有兼容与支持 NTFS 文件的特性,只是被苹果隐藏起来了,今天PC6小编就给大家带来不用安装第三方NTFS读写工具即可在Mac上读写NTFS格式硬盘的教程. 温馨提示:此教程需要中高级用户通过输入终端命令行来进行操作,请新用