主要内容

对不支持格式的图像文件进行块处理金宝app

除了读取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文件:

  1. 打开文件:

    file_name =“rio.lan”;Fid = fopen(file_name,“r”);
  2. 读取头文件的前六个字节:

    头字=读音(fid,6,“uint8 = >字符”)”;流('版本ID: %s\n',中心词);
  3. 阅读包装类型:

    Pack_type = fread(fid,1,“uint16”0,“ieee-le”);流('包装类型:%d\n', pack_type);
  4. 读取光谱波段的数量:

    Num_bands = fread(fid,1,“uint16”0,“ieee-le”);流('带数:%d\n', num_bands);
  5. 读取图像的宽度和高度:

    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、宽度、高度);
  6. 关闭文件:

    文件关闭(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函数。的LanAdapterclass是LAN文件的图像适配器类,是图像处理工具箱软件的一部分。

检查LanAdapter类

类的构造函数、属性和方法LanAdapter类。研究LanAdapter类帮助您为编写自己的Image Adapter类做准备。如果您不熟悉面向对象编程,请参见开发类——典型的工作流关于写作课程的一般信息。

开放LanAdapter.m然后看看的实现LanAdapter类。

Classdef

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对象时,类通常负有在类构造函数中创建新文件的额外责任。此文件创建需要构造函数中更复杂的语法,其中可能需要指定要创建的新文件的大小和数据类型。创建新文件的构造函数还可能遇到其他问题,例如操作系统文件权限或潜在的困难的文件创建代码。

使用LanAdapter类blockproc

既然你明白了LanAdapter类工作,您可以使用它来增强LAN文件的可见波段。看到计算大图像的统计信息示例看看如何blockproc函数与LanAdapter类。

另请参阅

||

相关的话题