主要内容

导出到图像

从MATLAB导出数据®工作区中使用的标准图形文件格式之一,请使用imwrite函数。支持TIFF (Tagged Image File Format)、JPEG (Joint Photographic Experts Group)、PNG (Portable Network Graphics)等格式的数据导出。有关支持的格式的完整列表,请参见万博1manbetximwrite参考页面。

的多维数组uint8数据从MATLAB工作区转换成TIFF格式的文件。写入文件的输出图像的类别取决于指定的格式。对于大多数格式,如果输入数组属于类uint8imwrite将数据输出为8位值。看到imwrite详情参考页。

whos I名称大小字节类我650x600x3 1170000 uint8数组总是1170000元素使用1170000字节imwrite(我,' my_graphics_file.tif','tif');

请注意

imwrite万博1manbetx支持几种标准格式的不同语法。例如,使用TIFF文件格式,您可以指定MATLAB用于存储图像的压缩类型。看到imwrite详情参考页。

有关将数据写入TIFF文件的更多控制,请使用Tiffobject-see将图像数据和元数据导出到TIFF文件获取更多信息。

将图像数据和元数据导出到TIFF文件

你可以用imwrite要将图像数据和元数据(标签)导出到带标签图像文件格式(TIFF)文件,该功能确实有一些限制。例如,当要修改文件中的图像数据或元数据时,必须将所有数据写入文件。不能只写更新后的部分。使用Tiff对象,您可以写入图像数据的部分,并修改或向TIFF文件添加单独的标记。当你构造一个Tiff对象,它表示您与TIFF文件的连接,并提供对LibTIFF库中的许多例程的访问。

以下部分提供了使用的逐步示例Tiff对象方法和属性来使用TIFF文件执行一些常见任务。来充分利用Tiff对象,您必须熟悉TIFF规范和技术说明。查看此文档,请访问LibTIFF - TIFF库和实用程序

创建一个新的TIFF文件

  1. 创建一些图像数据。下面的例子从MATLAB包含的JPEG文件中读取图像数据:

    Imgdata = imread('ngc6543 .jpg');
  2. 创建一个新的TIFF文件Tiff对象,指定新文件的名称作为参数。若要创建文件,必须指定写入模式(' w ')或追加模式(“一个”):

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

    创建新TIFF文件时,Tiff构造函数创建一个包含映像文件目录(IFD)的文件。TIFF文件使用这个IFD来组织与特定图像相关的所有数据和元数据。一个TIFF文件可以包含多个ifd。的Tiff对象创建的IFD当前的IFD。Tiff对象方法操作当前IFD。您可以在TIFF文件中的IFD之间导航,并指定当前使用的IFD是哪个IFDTiff对象的方法。

  3. 方法设置所需的TIFF标记setTag方法Tiff对象。这些必需的标记指定了关于图像的信息,比如它的长度和宽度。要将图像数据分割为条,请为RowsPerStrip标签。属性的值可将图像数据分解为磁块TileWidth而且TileLength标签。该示例创建了一个包含标记名称和值的结构,并将其传递给setTag.您还可以单独设置每个标记。

    tagstruct。我mageLength = size(imgdata,1); tagstruct.ImageWidth = size(imgdata,2); tagstruct.Photometric = Tiff.Photometric.RGB; tagstruct.BitsPerSample = 8; tagstruct.SamplesPerPixel = 3; tagstruct.RowsPerStrip = 16; tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tagstruct.Software = 'MATLAB'; tagstruct % display tagstruct setTag(t,tagstruct)

    有关受支持的TIFF标记以及如何设置其值的信万博1manbetx息,请参见设置标签值.例如,Tiff对象支持可用于万博1manbetx设置某些属性值的属性。本例使用Tiff对象PlanarConfiguration属性为大块配置指定正确的值:Tiff.PlanarConfiguration.Chunky

  4. 将映像数据和元数据写入当前目录方法Tiff对象。

    写(t, imgdata);

    如果要在文件中放入多个图像,请调用writeDirectory方法。的writeDirectory方法在文件中设置一个新的图像文件目录,并将此新目录设置为当前目录。

  5. 方法关闭与该文件的连接Tiff对象:

    关闭(t);
  6. 方法测试是否创建了有效的TIFF文件imread函数读取文件,然后显示图像:

    显示亮度图像(imread (' myfile.tif '));

写入图像数据的条带或平铺

请注意

如果数据未压缩,则只能修改图像数据的条或平铺。

  1. 控件,打开现有TIFF文件进行修改Tiff对象。中创建的文件创建一个新的TIFF文件.的Tiff类的句柄Tiff对象。

    t = Tiff('myfile.tif','r+');
  2. 生成一些要写入映像中的条带的数据。这个示例创建了一个三维零数组,其大小相当于一个条带。该代码使用条带中的行数、图像的宽度和每个像素的样本数作为维度。数组是的数组uint8值。

    width = getTag(t,'ImageWidth');height = getTag(t,'RowsPerStrip');numSamples = getTag(t,'SamplesPerPixel');stripData = 0(高度,宽度,numSamples,'uint8');

    如果图像数据具有平铺布局,则可以使用TileWidth而且TileLength标记来指定尺寸。

  3. 方法将数据写入文件中的条带writeEncodedStrip方法。指定标识要修改的条带的索引号。示例选择了第18条,因为它更容易看到图像中的变化。

    writeEncodedStrip (t, 18岁,stripData);

    如果图像具有平铺布局,则可以使用writeEncodedTile方法修改磁贴。

  4. 方法关闭与该文件的连接Tiff对象。

    关闭(t);
  5. 方法测试您是否修改了TIFF文件中的图像条imread函数读取文件,然后显示图像。

    Modified_imgdata = imread('myfile.tif');显示亮度图像(modified_imgdata)

    注意图像中间的黑色条纹。

修改TIFF文件元数据(标签)

  1. 方法打开现有TIFF文件以进行修改Tiff对象。中创建的文件创建一个新的TIFF文件.的Tiff类的句柄Tiff对象。

    t = Tiff('myfile.tif','r+');
  2. 文件中不包含艺术家标记,使用getTag方法。这段代码应该发出一条错误消息,说明它无法检索标记。

    artist_value = getTag(t,'Artist');
  3. 添加艺术家标记。setTag方法。

    setTag (t,“艺术家”,“毕加索”);
  4. 方法将新的标记数据写入TIFF文件rewriteDirectory方法。使用rewriteDirectory在修改文件中的现有元数据或向文件中添加新元数据时,方法。

    rewriteDirectory (t);
  5. 方法关闭与该文件的连接Tiff对象。

    关闭(t);
  6. 的值来测试工作,方法是重新打开TIFF文件并获得艺术家标记,使用getTag方法。

    t = Tiff('myfile.tif', 'r');getTag(t,'Artist') ans = Pablo Picasso close(t);

创建TIFF文件子目录

  1. 创建一些图像数据。这个例子从MATLAB包含的JPEG文件中读取图像数据。然后,该示例创建图像数据的两个降低分辨率(缩略图)版本。

    Imgdata = imread('ngc6543 .jpg');减少像素数量的一半。Img_half = imgdata(1:2:end,1:2:end,:);减少像素数的三分之一。Img_third = imgdata(1:3:end,1:3:end,:);
  2. 创建一个新的TIFF文件Tiff对象,并指定新文件的名称作为参数。若要创建文件,必须指定写入模式(' w ')或追加模式(“一个”).的Tiff类的句柄Tiff对象。

    t = Tiff('my_subimage_file.tif','w');
  3. 方法设置所需的TIFF标记setTag方法Tiff对象。这些必需的标记指定了关于图像的信息,比如它的长度和宽度。要将图像数据分割为条,请为RowsPerStrip标签。要将图像数据分解为磁块,请使用TileWidth而且TileLength标签。该示例创建了一个包含标记名称和值的结构,并将其传递给setTag.您还可以单独设置每个标记。

    创建子目录时,必须设置SubIFD标记,指定要创建的子目录的数量。方法的值并不是指定的数字SubIFD标签。这个数字告诉我们Tiff用于创建SubIFD它指向两个子目录。的实际值SubIFD标记将是两个子目录的字节偏移量。

    tagstruct。我mageLength = size(imgdata,1); tagstruct.ImageWidth = size(imgdata,2); tagstruct.Photometric = Tiff.Photometric.RGB; tagstruct.BitsPerSample = 8; tagstruct.SamplesPerPixel = 3; tagstruct.RowsPerStrip = 16; tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tagstruct.Software = 'MATLAB'; tagstruct.SubIFD = 2 ; % required to create subdirectories tagstruct % display tagstruct setTag(t,tagstruct)

    有关受支持的TIFF标记以及如何设置其值的信万博1manbetx息,请参见设置标签值.例如,Tiff对象支持可用于万博1manbetx设置某些属性值的属性。本例使用Tiff对象PlanarConfiguration属性为大块配置指定正确的值:Tiff.PlanarConfiguration.Chunky

  4. 将映像数据和元数据写入当前目录方法Tiff对象。

    写(t, imgdata);
  5. 方法设置第一个子目录writeDirectory方法。的writeDirectory方法设置子目录并将新目录设置为当前目录。因为您指定了要创建两个子目录,writeDirectory设置子目录。

    writeDirectory (t);
  6. 设置所需的标记,就像对常规目录所做的一样。根据LibTIFF API,子目录不能包含SubIFD标签。

    tagstruct2。我mageLength = size(img_half,1); tagstruct2.ImageWidth = size(img_half,2); tagstruct2.Photometric = Tiff.Photometric.RGB; tagstruct2.BitsPerSample = 8; tagstruct2.SamplesPerPixel = 3; tagstruct2.RowsPerStrip = 16; tagstruct2.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tagstruct2.Software = 'MATLAB'; tagstruct2 % display tagstruct2 setTag(t,tagstruct2)
  7. 将图像数据和元数据写入子目录方法Tiff对象。

    写(t, img_half);
  8. 方法设置第二个子目录writeDirectory方法。的writeDirectory方法设置子目录并将其设置为当前目录。

    writeDirectory (t);
  9. 设置所需的标记,就像对任何目录一样。根据LibTIFF API,子目录不能包含SubIFD标签。

    tagstruct3。ImageLength= size(img_third,1); tagstruct3.ImageWidth = size(img_third,2); tagstruct3.Photometric = Tiff.Photometric.RGB; tagstruct3.BitsPerSample = 8; tagstruct3.SamplesPerPixel = 3; tagstruct3.RowsPerStrip = 16; tagstruct3.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tagstruct3.Software = 'MATLAB'; tagstruct3 % display tagstruct3 setTag(t,tagstruct3)
  10. 将图像数据和元数据写入子目录方法Tiff对象:

    写(t, img_third);
  11. 方法关闭与该文件的连接Tiff对象:

    关闭(t);

设置标签值

下表列出了所有TIFF标记Tiff对象支持并包含万博1manbetx关于它们的MATLAB类和大小的信息。对于某些标记,该表还指示用于标记的值集Tiff对象支持的所有万博1manbetx值,它是TIFF规范定义的所有可能值的子集。您可以使用Tiff属性结构指定这些标记所支持的值。万博1manbetx例如,使用Tiff.Compression.JPEG来指定JPEG压缩。有关完整的属性列表,请参阅Tiff参考页。

表1:支持的TIF万博1manbetxF标签

TIFF标签 大小 万博1manbetx支持的值 笔记
艺术家 字符 1 xn
BitsPerSample 1 x1 1、8、16、32、64 看到表2
ColorMap 256年x3 值应该在0-1之间标准化。内部存储为uint16值。 光度必须调色板
压缩 1 x1 没有一个: 1
CCITTRLE: 2
CCITTFax3: 3
CCITTFax4: 4
LZW: 5
JPEG: 7
CCITTRLEW: 32771
PackBits: 32773
缩小: 32946
AdobeDeflate: 8
看到表3
版权 字符 1 xn
DateTime 字符 1 x19 如果需要,返回值被填充为19个字符。
DocumentName 字符 1 xn
DotRange 1 x2 光度必须分离
ExtraSamples 1 xn 未指明的: 0
AssociatedAlpha: 1
UnassociatedAlpha: 2
看到表4
FillOrder 1 x1
GeoAsciiParamsTag 字符 1 xn
GeoDoubleParamsTag 1 xn
GeoKeyDirectoryTag Nx4
Group3Options 1 x1 压缩必须CCITTFax3
Group4Options 1 x1 压缩必须CCITTFax4
HalfToneHints 1 x2
HostComputer 字符 1 xn
ICCProfile uint8 1 xn
ImageDescription 字符 1 xn
ImageLength 1 x1
ImageWidth 1 x1
InkNames Char单元数组 1 x
NumInks
光度必须分离
InkSet 1 x1 CMYK: 1
MultiInk: 2
光度必须分离
JPEGQuality 1 x1 取值在1到100之间
使 字符 1 xn
MaxSampleValue 1 x1 0 - 65535
MinSampleValue 1 x1 0 - 65535
模型 字符 1 xn
ModelPixelScaleTag 1 x3
ModelTiepointTag Nx6
ModelTransformationMatrixTag 1乘16
NumberOfInks 1 x1 必须等于SamplesPerPixel
取向 1 x1 TopLeft: 1
TopRight: 2
BottomRight: 3
BottomLeft: 4
LeftTop: 5
RightTop: 6
RightBottom: 7
LeftBottom: 8
PageName 字符 1 xn
PageNumber 1 x2
光度 1 x1 MinIsWhite: 0
MinIsBlack: 1
RGB: 2
调色板: 3
面具: 4
分离: 5
YCbCr: 6
CIELab: 8
ICCLab: 9
ITULab: 10
看到表2
Photoshop uint8 1 xn
PlanarConfiguration 1 x1 厚实: 1
单独的: 2
PrimaryChromaticities 1 x6
ReferenceBlackWhite 1 x6
ResolutionUnit 1 x1
RICHTIFFIPTC uint8 1 xn
RowsPerStrip 1 x1
RPCCoefficientTag 1 x92 92元行向量 看到表6
SampleFormat 1 x1 使用Uint: 1
Int: 2
IEEEFP: 3
看到表2
SamplesPerPixel 1 x1
SMaxSampleValue 1 x1 为图像数据指定的MATLAB数据类型范围
SMinSampleValue 1 x1 为图像数据指定的MATLAB数据类型范围
软件 字符 1 xn
StripByteCounts 1 xn 只读
StripOffsets 1 xn 只读
SubFileType 1 x1 默认的: 0
ReducedImage: 1
页面: 2
面具: 4
SubIFD 1 x1
TargetPrinter 字符 1 xn
阈值 1 x1 上下两层的: 1
半色调: 2
ErrorDiffuse: 3

光度可以是:MinIsWhiteMinIsBlack

TileByteCounts 1 xn 只读
TileLength 1 x1 一定是16的倍数
TileOffsets 1 xn 只读
TileWidth 1 x1 一定是16的倍数
TransferFunction 看到的请注意1 每个值应该在0-2 ^16-1之间 SamplePerPixel可以是1或3
WhitePoint 1 x2 光度可以是:RGB
调色板
YCbCr
CIELab
ICCLab
ITULab
XMP 字符 1 xn N > 5
XPostion 1 x1
XResolution 1 x1
YCbCrCoefficents 1 x3 光度必须YCbCr
YCbCrPositioning 1 x1 为中心的: 1
Cosited: 2
光度必须YCbCr
YCbCrSubSampling 1 x2 光度必须YCbCr
YPosition 1 x1
YResolution 1 x1
ZipQuality 1 x1 取值在1到9之间

1大小是1 x2 ^ BitsPerSample3 x2 ^ BitsPerSample

表2:BitsPerSample设置的有效SampleFormat值

BitsPerSample SampleFormat MATLAB数据类型
1 使用Uint 逻辑
8 使用UintInt uint8int8
16 使用UintInt uint16int16
32 使用UintIntIEEEFP uint32int32
64 IEEEFP

表3:BitsPerSample和Photometric组合的有效SampleFormat值

BitsPerSample值
光度值 1 8 16 32 64
MinIsWhite 使用Uint 使用Uint / Int 使用Uint
Int
使用Uint
Int
IEEEFP
IEEEFP
MinIsBlack 使用Uint 使用Uint / Int 使用Uint
Int
使用Uint
Int
IEEEFP
IEEEFP
RGB 使用Uint 使用Uint 使用Uint
IEEEFP
IEEEFP
调色板 使用Uint 使用Uint
面具 使用Uint
分离 使用Uint 使用Uint 使用Uint
IEEEFP
IEEEFP
YCbCr 使用Uint 使用Uint 使用Uint
IEEEFP
IEEEFP
CIELab 使用Uint 使用Uint
ICCLab 使用Uint 使用Uint
ITULab 使用Uint 使用Uint

表4:BitsPerSample和压缩组合的有效SampleFormat值

BitsPerSample值
压缩值 1 8 16 32 64
没有一个 使用Uint 使用Uint
Int
使用Uint
Int
使用Uint
Int
IEEEFP
IEEEFP
CCITTRLE 使用Uint
CCITTFax3 使用Uint
CCITTFax4 使用Uint
LZW 使用Uint 使用Uint
Int
使用Uint
Int
使用Uint
Int
IEEEFP
IEEEFP
JPEG 使用Uint
Int
CCITTRLEW 使用Uint
PackBits 使用Uint 使用Uint
Int
使用Uint
Int
使用Uint
Int
IEEEFP
IEEEFP
缩小 使用Uint 使用Uint
Int
使用Uint
Int
使用Uint
Int
IEEEFP
IEEEFP
AdobeDeflate 使用Uint 使用Uint
Int
使用Uint
Int
使用Uint
Int
IEEEFP
IEEEFP

表5:光度设置的有效SamplesPerPixel值

光度值 SamplesPerPixel1
MinIsWhite 1 +
MinIsBlack 1 +
RGB 3 +
调色板 1
面具 1
分离 1 +
YCbCr 3.
CIELab 3 +
ICCLab 3 +
ITULab 3 +

表6:rpccoefficients标签值描述列表

92元向量中的索引值 值描述1 单位
1 均方根偏差误差 米/水平轴
2 均方根随机误差 米/水平轴
3. 线偏移量 像素
4 样本抵消 像素
5 大地纬度偏移
6 大地经度偏移
7 大地高度偏移
8 线尺度因子 像素
9 样本比例因子 像素
10 大地纬度比例尺
11 大地经度刻度
12 大地高度比例因子
13到32 分子系数r (n),有理多项式方程2
33到52 有理多项式方程的分母系数r (n)
53到72 分子系数c (n),有理多项式方程2
73到92 有理多项式方程的分母系数c (n)

1属性指定此向量中的值RPCCoefficientTag对象,看到RPCCoefficientTag(映射工具箱)在映射工具箱™。

2方程r (n)而且c (n)表示一般严格投影模型的规格化的行值和列值。

另请参阅

外部网站