导出到图像
要使用某一标准图形文件格式从 MATLAB® 工作区导出数据,请使用 imwrite
函数。使用此函数,可以以诸如带标记的图像文件格式 (TIFF)、联合图像专家组 (JPEG) 和可移植网络图形 (PNG) 格式导出数据。有关所支持格式的完整列表,请参阅 imwrite
参考页。
例如,将 MATLAB 工作区中的 uint8
数据 I
的一个多维数组写入一个 TIFF 格式的文件。写入该文件的输出图像的类取决于指定的格式。对于大多数格式,如果输入数组为 uint8
类,则 imwrite
将以 8 位值输出数据。有关详细信息,请参阅 imwrite
参考页。
I = imread("ngc6543a.jpg"); whos I
Name Size Bytes Class Attributes I 650x600x3 1170000 uint8
imwrite(I,"my_graphics_file.tif","tif")
注意
imwrite
支持对多种标准格式使用不同语法。例如,对于 TIFF 文件格式,您可以指定 MATLAB 用于存储图像的压缩类型。有关详细信息,请参阅 imwrite
参考页。
在将数据写入 TIFF 文件的过程中若要获得更多控制,请使用 Tiff
对象。有关详细信息,请参阅将图像数据和元数据导出到 TIFF 文件。
将图像数据和元数据导出到 TIFF 文件
虽然可以使用 imwrite
将图像数据和元数据(标记)导出到带标记的图像文件格式 (TIFF) 文件,但此函数有一些限制。例如,当要修改文件中的图像数据或元数据时,必须将所有数据写入文件。您不能只写入更新的部分。使用 Tiff
对象,可以写入部分图像数据,并修改单个标记或将其添加到 TIFF 文件。构造的 Tiff
对象表示与 TIFF 文件的连接,并提供对 LibTIFF 库中的众多例程的访问。
这些示例分步演示如何使用 Tiff
对象方法和属性来执行关于 TIFF 文件的一些常见任务。为充分利用 Tiff
对象,您必须熟悉 TIFF 规范和技术说明。请访问 LibTIFF - TIFF 库和实用工具查看此文档。
创建 TIFF 文件
创建一些图像数据。
imgdata = imread("ngc6543a.jpg");
通过构造 Tiff
对象来创建新的 TIFF 文件,并将新文件名指定为参量。要创建文件,必须指定写入模式 ("w"
) 或追加模式 ("a"
)。
t = Tiff("myfile.tif","w");
当创建新的 TIFF 文件时,Tiff
构造函数会创建一个包含图像文件目录 (IFD) 的文件。TIFF 文件使用此 IFD 来组织与特定图像相关联的所有数据和元数据。一个 TIFF 文件可以包含多个 IFD。Tiff
对象将它创建的 IFD 设为当前 IFD。Tiff
对象方法对当前 IFD 进行操作。可以使用 Tiff
对象方法在 TIFF 文件中的各 IFD 之间导航并指定哪个 IFD 是当前 IFD。
使用 Tiff
对象的 setTag
方法设置 TIFF 标记。这些标记包括必需标记和可选标记,并指定有关图像的信息,如图像的长度和宽度。要将图像数据分割为条带,请指定 RowsPerStrip
标记的值;要将图像数据分割为图块,请指定 TileWidth
和 TileLength
标记的值。以下示例创建一个包含标记名称和值的结构体,并将其传递给 setTag
。您还可以单独设置每个标记。
tagstruct.ImageLength = size(imgdata,1); tagstruct.ImageWidth = size(imgdata,2); tagstruct.Photometric = Tiff.Photometric.RGB; tagstruct.BitsPerSample = 8; tagstruct.SamplesPerPixel = 3; tagstruct.RowsPerStrip = 16; tagstruct.Software = "MATLAB"; tagstruct % display tagstruct
tagstruct = struct with fields:
ImageLength: 650
ImageWidth: 600
Photometric: 2
BitsPerSample: 8
SamplesPerPixel: 3
RowsPerStrip: 16
Software: "MATLAB"
setTag(t,tagstruct)
有关支持的 TIFF 标记以及如何设置其值的信息,请参阅设置标记值。例如,Tiff
对象支持一些属性,您可以用这些属性来设置某些特定标记的值。此示例使用 Tiff
对象的 Photometric
属性为 RGB 配置指定正确的值:Tiff.Photometric.RGB
。
使用 Tiff
对象的 write
方法将图像数据和元数据写入当前目录。
write(t,imgdata)
如果要将多个图像放入文件,则应该在执行此写入操作后立即调用 writeDirectory
方法。writeDirectory
方法在文件中设置一个新的图像文件目录,并将该新目录设为当前目录。
通过关闭 Tiff
对象来关闭与文件的连接。
close(t)
通过使用 imread
函数读取文件,然后显示图像,来测试是否创建了有效的 TIFF 文件。
imagesc(imread("myfile.tif"))
写入图像数据的条带或图块
注意:如果数据未压缩,则只能修改图像数据的一个条带或图块。
通过创建 Tiff
对象来打开现有的 TIFF 文件进行修改。此示例使用在 创建 TIFF 文件 中创建的文件。Tiff
构造函数返回 Tiff
对象的句柄。
t = Tiff("myfile.tif","r+");
生成一些数据以写入图像中的条带。此示例创建一个由零值构成的三维数组,其大小与条带大小相同。代码使用条带中的行数、图像宽度和每个像素的样本数作为维度。该数组由 uint8
值构成。
width = getTag(t,"ImageWidth"); height = getTag(t,"RowsPerStrip"); numSamples = getTag(t,"SamplesPerPixel"); stripData = zeros(height,width,numSamples,"uint8");
如果图像数据具有分块布局,则可以使用 TileWidth
和 TileLength
标记来指定维度。
使用 writeEncodedStrip
方法将数据写入文件中的条带。指定标识要修改的条带的索引编号。此示例选取条带 18,因为它更容易反映图像中的变化。
writeEncodedStrip(t,18,stripData)
如果图像具有分块布局,则可以使用 writeEncodedTile
方法修改图块。
通过关闭 Tiff
对象来关闭与文件的连接。
close(t)
通过使用 imread
函数读取文件,然后显示图像,来测试是否修改了 TIFF 文件中图像的条带。
modified_imgdata = imread("myfile.tif");
imagesc(modified_imgdata)
注意贯穿图像中间的黑色条带。
修改 TIFF 文件元数据(标记)
通过创建 Tiff
对象来打开现有的 TIFF 文件进行修改。此示例使用在 创建 TIFF 文件 中创建的文件。Tiff
构造函数返回 Tiff
对象的句柄。
t = Tiff("myfile.tif","r+");
该文件当前不包含 Artist
标记。如果您运行 getTag(t,"Artist")
,您将看到错误。使用 setTag
方法添加 Artist
标记。
setTag(t,"Artist","Pablo Picasso")
使用 rewriteDirectory
方法将新的标记数据写入 TIFF 文件。在修改文件中的现有元数据或向文件添加新元数据时,使用 rewriteDirectory
方法。
rewriteDirectory(t)
通过关闭 Tiff
对象来关闭与文件的连接。
close(t)
通过重新打开 TIFF 文件并使用 getTag
方法获取 Artist
标记的值来测试所做的工作。
t = Tiff("myfile.tif","r"); getTag(t,"Artist")
ans = 'Pablo Picasso'
close(t)
创建 TIFF 子目录
此示例从一个 JPEG 文件中读取图像数据,然后在图像数据的基础上创建两个低分辨率(缩略图)版本。
创建一些图像数据。
imgdata = imread("ngc6543a.jpg"); % % Reduce number of pixels by one half. img_half = imgdata(1:2:end,1:2:end,:); % % Reduce number of pixels by two thirds. img_third = imgdata(1:3:end,1:3:end,:);
通过构造 Tiff
对象来创建新的 TIFF 文件,并将新文件名指定为参量。要创建文件,必须指定写入模式 ("w"
) 或追加模式 ("a"
)。Tiff
构造函数返回 Tiff
对象的句柄。
t = Tiff("my_subimage_file.tif","w");
使用 Tiff
对象的 setTag
方法设置 TIFF 标记。这些标记包括必需标记和可选标记,并指定有关图像的信息,如图像的长度和宽度。要将图像数据分割为条带,请指定 RowsPerStrip
标记的值;要将图像数据分割为图块,请指定 TileWidth
和 TileLength
标记的值。以下示例创建一个包含标记名称和值的结构体,并将其传递给 setTag
。您还可以单独设置每个标记。
要创建子目录,必须设置 SubIFD
标记,指定要创建的子目录的数量。请注意,您指定的数字不是 SubIFD
标记的值。该数字告知 Tiff
软件创建一个指向两个子目录的 SubIFD
。SubIFD
标记的实际值将是两个子目录的字节偏移量。
tagstruct.ImageLength = size(imgdata,1); tagstruct.ImageWidth = size(imgdata,2); tagstruct.Photometric = Tiff.Photometric.RGB; tagstruct.BitsPerSample = 8; tagstruct.SamplesPerPixel = 3; tagstruct.RowsPerStrip = 16; tagstruct.Software = "MATLAB"; tagstruct.SubIFD = 2; % required to create subdirectories tagstruct % display tagstruct
tagstruct = struct with fields:
ImageLength: 650
ImageWidth: 600
Photometric: 2
BitsPerSample: 8
SamplesPerPixel: 3
RowsPerStrip: 16
Software: "MATLAB"
SubIFD: 2
setTag(t,tagstruct)
有关支持的 TIFF 标记以及如何设置其值的信息,请参阅设置标记值。例如,Tiff
对象支持一些属性,您可以用这些属性来设置某些特定标记的值。此示例使用 Tiff
对象的 Photometric
属性为 RGB 配置指定正确的值:Tiff.Photometric.RGB
。
使用 Tiff
对象的 write
方法将图像数据和元数据写入当前目录。
write(t,imgdata)
通过调用 writeDirectory
方法设置第一个子目录。writeDirectory
方法设置子目录并将新目录设为当前目录。因为您指定要创建两个子目录,writeDirectory
会设置一个子目录。
writeDirectory(t)
设置标记,就像对常规目录所做的那样。根据 LibTIFF API,子目录不能包含 SubIFD
标记。
tagstruct2.ImageLength = 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.Software = "MATLAB"; tagstruct2 % display tagstruct2
tagstruct2 = struct with fields:
ImageLength: 325
ImageWidth: 300
Photometric: 2
BitsPerSample: 8
SamplesPerPixel: 3
RowsPerStrip: 16
Software: "MATLAB"
setTag(t,tagstruct2)
使用 Tiff
对象的 write
方法将图像数据和元数据写入子目录。
write(t,img_half)
通过调用 writeDirectory
方法设置第二个子目录。writeDirectory
方法设置子目录并将其设为当前目录。
writeDirectory(t)
设置标记,就像对任何目录所做的那样。
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.Software = "MATLAB"; tagstruct3 % display tagstruct3
tagstruct3 = struct with fields:
ImageLength: 217
ImageWidth: 200
Photometric: 2
BitsPerSample: 8
SamplesPerPixel: 3
RowsPerStrip: 16
Software: "MATLAB"
setTag(t,tagstruct3)
使用 Tiff
对象的 write
方法将图像数据和元数据写入子目录。
write(t,img_third)
通过关闭 Tiff
对象来关闭与文件的连接。
close(t)
设置标记值
下表列出了 Tiff
对象支持的所有 TIFF 标记,并包括有关其 MATLAB 类和大小的信息。对于某些标记,该表还指示了 Tiff
对象支持的值集合,它是 TIFF 规范定义的所有可能值的子集。您可以使用 Tiff
属性结构体为这些标记指定支持的值。例如,用 Tiff.Compression.JPEG
指定 JPEG 压缩。有关完整的属性列表,请参阅 Tiff
参考页。
表 1:支持的 TIFF 标记
TIFF 标记 | 类 | 大小 | 支持的值 | 注释 |
---|---|---|---|---|
Artist | char | 1×N | — | — |
BitsPerSample | double | 1×1 | 1 , 8 , 16 , 32 , 64 | 请参阅表 2 和表 3。 |
ColorMap | double | 256×3 | 值应在区间 [0 , 1 ] 内归一化。在内部存储为 uint16 值。 | Photometric 必须是 Palette 。 |
Compression | double | 1×1 | None : 1 CCITTRLE : 2 CCITTFax3 : 3 CCITTFax4 : 4 LZW : 5 JPEG : 7 CCITTRLEW : 32771 PackBits : 32773 Deflate : 32946 AdobeDeflate : 8 | 请参阅表 4。 |
Copyright | char | 1×N | — | — |
DateTime | char | 1×19 | 如果需要,将填充返回值以使其包含 19 个字符。 | — |
DocumentName | char | 1×N | — | — |
DotRange | double | 1×2 | — | Photometric 必须是 Separated 。 |
ExtraSamples | double | 1×N | Unspecified : 0 AssociatedAlpha : 1 UnassociatedAlpha : 2 | — |
FillOrder | double | 1×1 | — | — |
GeoAsciiParamsTag | char | 1×N | — | — |
GeoDoubleParamsTag | double | 1×N | — | — |
GeoKeyDirectoryTag | double | N ×4 | — | — |
Group3Options | double | 1×1 | — | Compression 必须是 CCITTFax3 。 |
Group4Options | double | 1×1 | — | Compression 必须是 CCITTFax4 。 |
HalfToneHints | double | 1×2 | — | — |
HostComputer | char | 1×N | — | — |
ICCProfile | uint8 | 1×N | — | — |
ImageDescription | char | 1×N | — | — |
ImageLength | double | 1×1 | — | — |
ImageWidth | double | 1×1 | — | — |
InkNames | char cell array | 1×NumInks | — | Photometric 必须是 Separated 。 |
InkSet | double | 1×1 | CMYK : 1 MultiInk : 2 | Photometric 必须是 Separated 。 |
JPEGQuality | double | 1×1 | 区间 [1 , 100 ] 中的值 | — |
Make | char | 1×N | — | — |
MaxSampleValue | double | 1×1 | 区间 [0 , 216-1 ] 中的值 | — |
MinSampleValue | double | 1×1 | 区间 [0 , 216-1 ] 中的值 | — |
Model | char | 1×N | — | — |
ModelPixelScaleTag | double | 1×3 | — | — |
ModelTiepointTag | double | N ×6 | — | — |
ModelTransformationMatrixTag | double | 1×16 | — | — |
NumberOfInks | double | 1×1 | — | NumberOfInks 必须等于 SamplesPerPixel 。 |
Orientation | double | 1×1 | TopLeft : 1 TopRight : 2 BottomRight : 3 BottomLeft : 4 LeftTop : 5 RightTop : 6 RightBottom : 7 LeftBottom : 8 | — |
PageName | char | 1×N | — | — |
PageNumber | double | 1×2 | — | — |
Photometric | double | 1×1 | MinIsWhite : 0 MinIsBlack : 1 RGB : 2 Palette : 3 Mask : 4 Separated : 5 YCbCr : 6 CIELab : 8 ICCLab : 9 ITULab : 10 | 请参阅表 3。 |
Photoshop | uint8 | 1×N | — | — |
PlanarConfiguration | double | 1×1 | Chunky : 1 Separate : 2 | — |
PrimaryChromaticities | double | 1×6 | — | — |
ReferenceBlackWhite | double | 1×6 | — | — |
ResolutionUnit | double | 1×1 | — | — |
RICHTIFFIPTC | uint8 | 1×N | — | — |
RowsPerStrip | double | 1×1 | — | — |
RPCCoefficientTag | double | 1×92 | — | 请参阅表 6。 |
SampleFormat | double | 1×1 | Uint : 1 Int : 2 IEEEFP : 3 | 请参阅表 2。 |
SamplesPerPixel | double | 1×1 | — | — |
SMaxSampleValue | double | 1×1 | 为图像数据指定的 MATLAB 数据类型的范围 | — |
SMinSampleValue | double | 1×1 | 为图像数据指定的 MATLAB 数据类型的范围 | — |
Software | char | 1×N | — | — |
StripByteCounts | double | 1×N | — | 只读 |
StripOffsets | double | 1×N | — | 只读 |
SubFileType | double | 1×1 | Default : 0 ReducedImage : 1 Page : 2 Mask : 4 | — |
SubIFD | double | 1×1 | — | — |
TargetPrinter | char | 1×N | — | — |
Thresholding | double | 1×1 | BiLevel : 1 HalfTone : 2 ErrorDiffuse : 3 | Photometric 必须为 MinIsWhite 或 MinIsBlack 。 |
TileByteCounts | double | 1×N | — | 只读 |
TileLength | double | 1×1 | 必须是 16 的倍数 | — |
TileOffsets | double | 1×N | — | 只读 |
TileWidth | double | 1×1 | 必须是 16 的倍数 | — |
TransferFunction | double | 请参阅注释1 | 必须在区间 [0 , 216-1 ] 内 | SamplesPerPixel 必须为 1 或 3 。 |
WhitePoint | double | 1×2 | — | Photometric 必须是 RGB 、Palette 、YCbCr 、CIELab 、ICCLab 或 ITULab 。 |
XMP | char | 1×N | — | N > 5 |
XPostion | double | 1×1 | — | — |
XResolution | double | 1×1 | — | — |
YCbCrCoefficients | double | 1×3 | — | Photometric 必须是 YCbCr 。 |
YCbCrPositioning | double | 1×1 | Centered : 1 Cosited : 2 | Photometric 必须是 YCbCr 。 |
YCbCrSubSampling | double | 1×2 | — | Photometric 必须是 YCbCr 。 |
YPosition | double | 1×1 | — | — |
YResolution | double | 1×1 | — | — |
ZipQuality | double | 1×1 | 必须在区间 [0 , 9 ] 内 | — |
1 大小为 1
×2BitsPerSample
或 3
×2BitsPerSample
。
表 2:BitsPerSample
设置的有效 SampleFormat
值
BitsPerSample | SampleFormat | MATLAB 数据类型 |
---|---|---|
1 | Uint | logical |
8 | Uint , Int | uint8 , int8 |
16 | Uint , Int | uint16 , int16 |
32 | Uint , Int , IEEEFP | uint32 , int32 , single |
64 | IEEEFP | double |
表 3:BitsPerSample
和 Photometric
组合的有效 SampleFormat
值
Photometric 值 | 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 |
Palette | — | Uint | Uint | — | — |
Mask | Uint | — | — | — | — |
Separated | — | Uint | Uint | Uint IEEEFP | IEEEFP |
YCbCr | — | Uint | Uint | Uint IEEEFP | IEEEFP |
CIELab | — | Uint | Uint | — | — |
ICCLab | — | Uint | Uint | — | — |
ITULab | — | Uint | Uint | — | — |
表 4:BitsPerSample
和 Compression
组合的有效 SampleFormat
值
Compression 值 | BitsPerSample 值 | ||||
---|---|---|---|---|---|
1 | 8 | 16 | 32 | 64 | |
None | 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 |
Deflate | Uint | Uint Int | Uint Int | Uint Int IEEEFP | IEEEFP |
AdobeDeflate | Uint | Uint Int | Uint Int | Uint Int IEEEFP | IEEEFP |
表 5:Photometric
设置的有效 SamplesPerPixel
值
Photometric 值 | SamplesPerPixel |
---|---|
MinIsWhite | 1+ |
MinIsBlack | 1+ |
RGB | 3+ |
Palette | 1 |
Mask | 1 |
Separated | 1+ |
YCbCr | 3 |
CIELab | 3+ |
ICCLab | 3+ |
ITULab | 3+ |
表 6:RPCCoefficientTag
值描述列表
92 元素向量中的索引值 | 值说明1 | 单位 |
---|---|---|
1 | 均方根偏差误差 | 每个水平轴的米数 |
2 | 均方根随机误差 | 每个水平轴的米数 |
3 | 线偏移量 | 像素 |
4 | 样本偏移量 | 像素 |
5 | 地理纬度偏移量 | 度 |
6 | 地理经度偏移量 | 度 |
7 | 地理高度偏移量 | 米 |
8 | 线缩放因子 | 像素 |
9 | 样本缩放因子 | 像素 |
10 | 地理纬度标度 | 度 |
11 | 地理经度标度 | 度 |
12 | 地理高度缩放因子 | 米 |
13 至 32 | 有理多项式 的分子系数2 | — |
33 至 52 | 有理多项式 的分母系数 | — |
53 至 72 | 有理多项式 的分子系数2 | — |
73 至 92 | 有理多项式 的分母系数 | — |
1要使用 RPCCoefficientTag
对象指定此向量中的值,请参阅 Mapping Toolbox™ 中的
。RPCCoefficientTag
(Mapping Toolbox)
2多项式
和 r
(n
)
表示通用严格投影模型的归一化行和列值。c
(n
)