除了读取TIFF或JPEG2000文件和写入TIFF文件外,还可以使用blockproc
函数可以读取和写入其他格式。类继承的类,才能使用另一种文件格式的图像数据ImageAdapter
类。的ImageAdapter
类是一个抽象类这是图像处理工具箱软件的一部分。它定义了方法的签名blockproc
用于磁盘上有映像的文件I/O。可以将Image Adapter类的实例与文件关联,并将它们作为参数使用blockproc
用于基于文件的块处理。
本节通过讨论一个示例类(Image Adapter类)来演示编写Image Adapter类的过程LanAdapter
类)。的LanAdapter
类是工具箱的一部分。使用这个简单的只读类来处理任意大的数据uint8
具有blockproc
.
要理解LanAdapter
类工作,你必须首先了解局域网文件格式。陆地卫星专题制图器图像以Erdas局域网文件格式存储。Erdas LAN文件包含一个128字节的头,后面跟着一个或多个频谱波段的数据,按波段数增加的顺序带行交错(BIL)。数据以小端字节顺序存储。头文件包含关于文件的几条重要信息,包括大小、数据类型和文件中包含的图像频带的数量。LAN文件格式规范定义了文件头的前24个字节,如表中所示。
文件头内容
字节 | 数据类型 | 内容 |
---|---|---|
1 - 6 | 标识文件格式版本的6字节字符数组 | “头” 或“HEAD74” (7.4之前的文件说“头” )。 |
7 - 8 | 16位整数 | 文件的包类型(表示位深度) |
9 - 10 | 16位整数 | 数据的频带数 |
16 | 6个字节 | 未使用的 |
17日 | 32位整数 | 数据列数 |
21 - 24日 | 32位整数 | 数据行数 |
剩下的104个字节包含文件的各种其他属性,本例没有使用这些属性。
通常,在处理LAN文件时,第一步是通过解析头来了解有关文件的更多信息。的标头进行解析rio.lan
文件:
打开文件:
file_name =“rio.lan”;Fid = fopen(file_name,“r”);
读取头文件的前六个字节:
头字=读音(fid,6,“uint8 = >字符”)”;流('版本ID: %s\n',中心词);
阅读包装类型:
Pack_type = fread(fid,1,“uint16”0,“ieee-le”);流('包装类型:%d\n', pack_type);
读取光谱波段的数量:
Num_bands = fread(fid,1,“uint16”0,“ieee-le”);流('带数:%d\n', num_bands);
读取图像的宽度和高度:
Unused_bytes = fread(fid,6,“uint8”0,“ieee-le”);宽度=读取(fid,1,“uint32”0,“ieee-le”);高度=读取(fid,1,“uint32”0,“ieee-le”);流(图像大小(w x h): %d x %d\n、宽度、高度);
关闭文件:
文件关闭(fid);
回显如下:
版本ID: HEAD74包类型:0带数:7镜像大小(宽×高):512 × 512
的rio.lan
文件是512 * 512,7波段的图像。包类型为0表示每个样本是一个8位无符号整数(uint8
数据类型)。
在典型的内存工作流中,您将使用multibandread
函数。LAN格式分别在波段3、2和1中存储可见光谱的RGB数据。您可以创建一个真彩色图像进行进一步处理。
真彩色= multibandread(“rio.lan”, [512, 512, 7],...' uint8 = > uint8”, 128,“比尔”,“ieee-le”, {“乐队”,“直接”,[3 2 1]});
然而,对于非常大的局域网文件,读取和处理内存中的整个映像使用multibandread
可能不切实际,这取决于您的系统功能。要避免内存限制,请使用blockproc
函数。与blockproc
,您可以使用基于文件的工作流处理图像。您可以读取、处理结果,然后写入结果,一次一个块。
的blockproc
函数只支持读取和写入某些文件金宝app格式,但它可以通过ImageAdapter
类。要为特定的文件格式编写图像适配器类,您必须能够:
查询磁盘上文件的大小
从文件中读取矩形数据块
如果满足这两个条件,就可以为LAN文件编写Image Adapter类。可以解析图像头以查询文件大小,还可以修改对的调用multibandread
读取一个特定的数据块。可以将用于这两个目标的代码封装在Image Adapter类结构中,然后直接使用blockproc
函数。的LanAdapter
class是LAN文件的图像适配器类,是图像处理工具箱软件的一部分。
类的构造函数、属性和方法LanAdapter
类。研究LanAdapter
类帮助您为编写自己的Image Adapter类做准备。如果您不熟悉面向对象编程,请参见开发类——典型的工作流关于写作课程的一般信息。
开放LanAdapter.m
然后看看的实现LanAdapter
类。
的LanAdapter
类以关键字开始classdef
.的classdef
节定义类名并指出LanAdapter
继承自ImageAdapter
超类。继承ImageAdapter
允许新类:
相互作用blockproc
常见的定义ImageAdapter
属性
定义接口blockproc
用于读写局域网文件
后,classdef
节,LanAdapter
类包含两个类属性块。第一个块包含公开可见但不能公开修改的属性。第二个块包含完全的公共属性。的LanAdapter
类将文件头中的一些信息存储为类属性。继承的其他类ImageAdapter
,但支持不同的文件格式金宝app,可以有不同的属性。
classdefLanAdapter < ImageAdapter属性(GetAccess = public, SetAccess = private)文件名NumBands结束属性(Access = public) SelectedBands结束
中定义的属性之外LanAdapter.m
类继承图象尺寸
属性中的ImageAdapter
超类。新类设置图象尺寸
属性。
类构造函数初始化LanAdapter
对象。的LanAdapter
构造函数解析LAN文件头信息并设置类属性。类中的类方法实现构造函数方法
块。
构造函数包含大量用于解析LAN文件头的相同代码。的LanAdapter
类只支持金宝appuint8
数据类型文件,因此构造函数验证LAN文件的包类型以及头词。类属性存储其余信息。负责读取像素数据的方法使用这些属性。的SelectedBands
属性允许读取频带的一个子集,默认设置为读取所有频带。
方法函数obj = LanAdapter(fname)LanAdapter类的构造函数。当创建一个新的LanAdapter对象时,读取该文件%头来验证文件以及保存一些图像%属性供以后使用。%打开文件。obj。文件名= fname;Fid = fopen(fname,“r”);确认文件以头词'HEADER'或% 'HEAD74',根据Erdas LAN文件规范。头字=读音(fid,6,“uint8 = >字符”);如果~ (strcmp(中心词”,“头”) || strcmp(头字',...“HEAD74”)错误(无效的局域网文件头。);结束从报头读取数据类型。Pack_type = fread(fid,1,“uint16”0,“ieee-le”);如果~ isequal (pack_type,0)错误([不支持金宝app的包类型。LanAdapter示例”...'只支持ui金宝appnt8数据。']);结束提供波段信息。obj。NumBands = fread(fid,1,“uint16”0,“ieee-le”);默认情况下,返回所有波段的数据obj。SelectedBands = 1:obj.NumBands;指定图像的宽度和高度。Unused_field = fread(fid,6,“uint8”0,“ieee-le”);宽度=读取(fid,1,“uint32”0,“ieee-le”);高度=读取(fid,1,“uint32”0,“ieee-le”);obj。ImageSize =[高度宽度];关闭文件句柄文件关闭(fid);结束% LanAdapter
适配器类在抽象超类中定义了两个必需的方法,ImageAdapter
.所有Image Adapter类都必须实现这些方法。的blockproc
函数使用第一个方法,readRegion
,从磁盘上的文件中读取数据块。第二种方法,关闭
,执行Image Adapter对象的任何必要的清理。
函数data = readRegion(obj, region_start, region_size)% readRegion从文件中读取矩形数据块。为MULTIBANDREAD准备各种参数。Header_size = 128;Rows = region_start(1):(region_start(1) + region_size(1) - 1);Cols = region_start(2):(region_start(2) + region_size(2) - 1);调用MULTIBANDREAD获取数据。Full_size = [obj.]图象尺寸obj。NumBands]; data = multibandread(obj.Filename, full_size,...' uint8 = > uint8”header_size,“比尔”,“ieee-le”,...{“行”,“直接”行},...{“列”,“直接”关口},...{“乐队”,“直接”, obj.SelectedBands});结束% readRegion
readRegion
有两个输入参数,region_start
而且region_size
.的region_start
参数中的两个元素向量(行坳)
,定义数据请求块中的第一个像素。的region_size
参数中的两个元素向量[num_rows num_cols]
,定义请求数据块的大小。的readRegion
方法使用这些输入参数从图像中读取并返回所请求的数据块。
的readRegion
方法对于不同的文件格式实现不同,这取决于可用于读取特定文件的工具。的readRegion
方法。LanAdapter
类使用输入参数来准备的自定义输入multibandread
.对于局域网文件,multibandread
提供一种方便的方法来读取图像的特定子部分。
另一个必需的方法是关闭
.的关闭
方法LanAdapter
类显示如下:
函数关上(obj)关闭LanAdapter对象。这种方法是一部分%的ImageAdapter接口,是必需的。因为readRegion方法是“原子的”,所以有%没有打开的文件句柄要关闭,因此此方法为空。结束结束%公共方法结束% LanAdapter
如注释所示,关闭
方法LanAdapter
没什么事,怎么样关闭
是空的。的multibandread
函数不需要维护打开的文件句柄,因此关闭
方法没有要清理的句柄。其他文件格式的图像适配器类可能有更丰富的内容关闭
方法,包括关闭文件句柄和执行其他类清理职责。
如前所述,LanAdapter
类只能读取LAN文件,不能写入。如果要将输出写入LAN格式文件,或另一个格式为blockproc
不支持,实现可选金宝appwriteRegion
方法。然后,可以将类指定为“目的地”
参数blockproc
并将输出写入您选择的格式的文件。
签署writeRegion
方法如下:
函数[] = writeRegion(obj, region_start, region_data)
第一个论证,region_start
,表示块的第一个像素writeRegion
写方法。第二个论点,region_data
,包含方法写入文件的新数据。
类,它们实现writeRegion
方法可以比LanAdapter
.在创建可写Image Adapter对象时,类通常负有在类构造函数中创建新文件的额外责任。此文件创建需要构造函数中更复杂的语法,其中可能需要指定要创建的新文件的大小和数据类型。创建新文件的构造函数还可能遇到其他问题,例如操作系统文件权限或潜在的困难的文件创建代码。
blockproc
既然你明白了LanAdapter
类工作,您可以使用它来增强LAN文件的可见波段。看到计算大图像的统计信息示例看看如何blockproc
函数与LanAdapter
类。
blockproc
|ImageAdapter
|multibandread