Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Realizar el procesamiento de bloques en archivos de imagen en formatos no compatibles

Además de leer archivos TIFF o JPEG2000 y escribir archivos TIFF, la función puede leer y escribir otros formatos.blockproc Para trabajar con datos de imagen en otro formato de archivo, debe construir una clase que herede de la clase.ImageAdapter La clase es una que forma parte del software.ImageAdapterclase abstracta (MATLAB)Image Processing Toolbox™ Define la firma para los métodos que se utiliza para la E/S de archivos con imágenes en el disco.blockproc Puede asociar instancias de una clase de adaptador de imagen a un archivo y usarlas como argumentos para el procesamiento de bloques basado en archivos.blockproc

En esta sección se muestra el proceso de escribir una clase de adaptador de imagen mediante una clase de ejemplo (la clase).LanAdapter La clase es parte de la caja de herramientas.LanAdapter Utilice esta clase simple de solo lectura para procesar archivos LAN arbitrariamente grandes con .uint8blockproc

Aprender más sobre el formato de archivo LAN

Para comprender cómo funciona la clase, primero debe conocer el formato de archivo LAN.LanAdapter Las imágenes de mapeadores temáticos de Landsat se almacenan en el formato de archivo LAN de Erdas. Los archivos LAN de Erdas contienen un encabezado de 128 bytes seguido de una o más bandas espectrales de datos, banda entrelazada por línea (BIL), en orden de aumento del número de banda. Los datos se almacenan en orden de bytes little-endian. El encabezado contiene varias partes de información importante sobre el archivo, incluido el tamaño, el tipo de datos y el número de bandas de imágenes contenidas en el archivo. La especificación de formato de archivo LAN define los primeros 24 bytes del encabezado del archivo como se muestra en la tabla.

Contenido de encabezado de archivo

BytesTipo de datosContenido
1–6Matriz de 6 bytes de caracteres que identifican la versión del formato de archivoo (Los archivos Pre-7.4 dicen .)'HEADER''HEAD74''HEADER'
7–8Entero de 16 bitsTipo de paquete del archivo (indicando la profundidad del bit)
9–10Entero de 16 bitsNúmero de bandas de datos
11–166 bytesInusitado
17–20Entero de 32 bitsNúmero de columnas de datos
21–24Entero de 32 bitsNúmero de filas de datos

Los 104 bytes restantes contienen varias otras propiedades del archivo, que este ejemplo no utiliza.

Análisis del encabezado

Normalmente, cuando se trabaja con archivos LAN, el primer paso es obtener más información sobre el archivo analizando el encabezado. El código siguiente muestra cómo analizar el encabezado del archivo:rio.lan

  1. Abra el archivo:

    file_name = 'rio.lan'; fid = fopen(file_name,'r');
  2. Lea los primeros seis bytes del encabezado:

    headword = fread(fid,6,'uint8=>char')'; fprintf('Version ID: %s\n',headword);
  3. Lea el tipo de paquete:

    pack_type = fread(fid,1,'uint16',0,'ieee-le'); fprintf('Pack Type: %d\n',pack_type);
  4. Lea el número de bandas espectrales:

    num_bands = fread(fid,1,'uint16',0,'ieee-le'); fprintf('Number of Bands: %d\n',num_bands);
  5. Lea el ancho y la altura de la imagen:

    unused_bytes = fread(fid,6,'uint8',0,'ieee-le'); width = fread(fid,1,'uint32',0,'ieee-le'); height = fread(fid,1,'uint32',0,'ieee-le'); fprintf('Image Size (w x h): %d x %d\n',width,height);
  6. Cierre el archivo:

    fclose(fid);

La salida aparece de la siguiente manera:

Version ID: HEAD74 Pack Type: 0 Number of Bands: 7 Image Size (w x h): 512 x 512 

El archivo es una imagen de 512 por 512 y 7 bandas.rio.lan El tipo de paquete de 0 indica que cada muestra es un entero sin signo de 8 bits (tipo de datos).uint8

Lectura del archivo

En un flujo de trabajo típico en memoria, leería este archivo LAN mediante la función.multibandread El formato LAN almacena los datos RGB del espectro visible en las bandas 3, 2 y 1, respectivamente. Puede crear una imagen truecolor para su posterior procesamiento.

truecolor = multibandread('rio.lan', [512, 512, 7],...    'uint8=>uint8', 128,'bil', 'ieee-le', {'Band','Direct',[3 2 1]});

Para archivos LAN muy grandes, sin embargo, leer y procesar toda la imagen en la memoria usando puede ser poco práctico, dependiendo de las capacidades del sistema.multibandread Para evitar limitaciones de memoria, utilice la función.blockproc Con , puede procesar imágenes con un flujo de trabajo basado en archivos.blockproc Puede leer, procesar y, a continuación, escribir los resultados, un bloque a la vez.

La función solo admite la lectura y escritura de determinados formatos de archivo, pero es extensible a través de la clase.blockprocImageAdapter Para escribir una clase de adaptador de imagen para un formato de archivo determinado, debe poder:

  • Consultar el tamaño del archivo en el disco

  • Leer un bloque rectangular de datos del archivo

Si cumple estas dos condiciones, puede escribir una clase de adaptador de imagen para archivos LAN. Puede analizar el encabezado de imagen para consultar el tamaño del archivo y modificar la llamada para leer un bloque de datos determinado.multibandread Puede encapsular el código para estos dos objetivos en una estructura de clase de adaptador de imagen y, a continuación, operar directamente en archivos LAN grandes con la función.blockproc La clase es una clase de adaptador de imagen para archivos LAN y forma parte del software.LanAdapterImage Processing Toolbox

Examen de la clase LanAdapter

En esta sección se describe el constructor, las propiedades y los métodos de la clase.LanAdapter Estudiar la clase te ayuda a escribir tu propia clase de adaptador de imagen.LanAdapter Si es nuevo en la programación orientada a objetos, consulte para obtener información general sobre cómo escribir clases.Desarrollo de clases: flujo de trabajo típico (MATLAB)

Abra y mire la implementación de la clase.LanAdapter.mLanAdapter

Classdef

La clase comienza con la palabra clave .LanAdapterclassdef La sección define el nombre de clase e indica que hereda de la superclase.classdefLanAdapterImageAdapter Heredar de permite que la nueva clase:ImageAdapter

  • Interactuar conblockproc

  • Definir propiedades comunesImageAdapter

  • Defina la interfaz que utiliza para leer y escribir en archivos LANblockproc

Propiedades

Siguiendo la sección, la clase contiene dos bloques de propiedades de clase.classdefLanAdapter El primer bloque contiene propiedades que son visibles públicamente, pero no se pueden modificar públicamente. El segundo bloque contiene propiedades totalmente públicas. La clase almacena cierta información del encabezado de archivo como propiedades de clase.LanAdapter Otras clases que también heredan de , pero que admiten diferentes formatos de archivo, pueden tener propiedades diferentes.ImageAdapter

classdef LanAdapter < ImageAdapter    properties(GetAccess = public, SetAccess = private)       Filename       NumBands    end     properties(Access = public)       SelectedBands    end

Además de las propiedades definidas en , la clase hereda la propiedad de la superclase.LanAdapter.mImageSizeImageAdapter La nueva clase establece la propiedad en el constructor.ImageSize

Métodos: Constructor de clases

El constructor de clase inicializa el objeto.LanAdapter El constructor analiza la información del encabezado del archivo LAN y establece las propiedades de clase.LanAdapter Implemente el constructor, un método de clase, dentro de un bloque.methods

El constructor contiene gran parte del mismo código utilizado para analizar el encabezado del archivo LAN. La clase solo admite archivos de tipo de datos, por lo que el constructor valida el tipo de paquete del archivo LAN, así como el encabezamiento.LanAdapteruint8 Las propiedades de clase almacenan la información restante. El método responsable de leer los datos de píxeles utiliza estas propiedades. La propiedad le permite leer un subconjunto de las bandas, con el valor predeterminado establecido para leer todas las bandas.SelectedBands

   methods        function obj = LanAdapter(fname)          % LanAdapter constructor for LanAdapter class.          % When creating a new LanAdapter object, read the file          % header to validate the file as well as save some image          % properties for later use.                       % Open the file.          obj.Filename = fname;          fid = fopen(fname,'r');           % Verify that the file begins with the headword 'HEADER' or          % 'HEAD74', as per the Erdas LAN file specification.          headword = fread(fid,6,'uint8=>char');          if ~(strcmp(headword','HEADER') || strcmp(headword',...                'HEAD74'))             error('Invalid LAN file header.');          end           % Read the data type from the header.          pack_type = fread(fid,1,'uint16',0,'ieee-le');          if ~isequal(pack_type,0)             error(['Unsupported pack type. The LanAdapter example ' ...                'only supports reading uint8 data.']);          end           % Provide band information.          obj.NumBands = fread(fid,1,'uint16',0,'ieee-le');          % By default, return all bands of data          obj.SelectedBands = 1:obj.NumBands;           % Specify image width and height.          unused_field = fread(fid,6,'uint8',0,'ieee-le');          width = fread(fid,1,'uint32',0,'ieee-le');          height = fread(fid,1,'uint32',0,'ieee-le');          obj.ImageSize = [height width];           % Close the file handle          fclose(fid);     end % LanAdapter 

Métodos: Requeridos

Las clases de adaptador tienen dos métodos necesarios definidos en la superclase abstracta, .ImageAdapter Todas las clases de adaptador de imagen deben implementar estos métodos. La función utiliza el primer método, , para leer bloques de datos de archivos en el disco.blockprocreadRegion El segundo método, , realiza cualquier limpieza necesaria de la Image Adapter objeto.close

   function data = readRegion(obj, region_start, region_size)       % readRegion reads a rectangular block of data from the file.        % Prepare various arguments to 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);         % Call MULTIBANDREAD to get data.       full_size = [obj.ImageSize obj.NumBands];       data = multibandread(obj.Filename, full_size,...      'uint8=>uint8', header_size, 'bil', 'ieee-le',...          {'Row',   'Direct', rows},...          {'Column','Direct', cols},...          {'Band',  'Direct', obj.SelectedBands});      end % readRegion

tiene dos argumentos de entrada, y .readRegionregion_startregion_size El argumento, un vector de dos elementos en el formulario , define el primer píxel en el bloque de solicitud de datos.region_start[row col] El argumento, un vector de dos elementos en el formulario , define el tamaño del bloque de datos solicitado.region_size[num_rows num_cols] El método utiliza estos argumentos de entrada para leer y devolver el bloque de datos solicitado de la imagen.readRegion

El método se implementa de forma diferente para diferentes formatos de archivo, dependiendo de qué herramientas están disponibles para leer los archivos específicos.readRegion El método de la clase utiliza los argumentos de entrada para preparar la entrada personalizada para .readRegionLanAdaptermultibandread Para archivos LAN, proporciona una manera conveniente de leer subsecciones específicas de una imagen.multibandread

El otro método requerido es .close El método de la clase aparece de la siguiente manera:closeLanAdapter

      function close(obj)       % Close the LanAdapter object. This method is a part       % of the ImageAdapter interface and is required.       % Since the readRegion method is "atomic", there are       % no open file handles to close, so this method is empty.        end             end % public methods      end % LanAdapter

Como indican los comentarios, el método para no tiene nada que hacer, por lo que está vacío.closeLanAdapterclose La función no requiere mantenimiento de identificadores de archivo abierto, por lo que el método no tiene identificadores para limpiar.multibandreadclose Las clases de adaptador de imagen para otros formatos de archivo pueden tener métodos más sustanciales, como el cierre de identificadores de archivo y la realización de otras responsabilidades de limpieza de clase.close

Métodos (opcional)

Como está escrito, la clase solo puede leer archivos LAN, no escribirlos.LanAdapter Si desea escribir la salida en un archivo de formato LAN u otro archivo con un formato que no admita, implemente el método opcional.blockprocwriteRegion A continuación, puede especificar la clase como parámetro y escribir la salida en un archivo del formato elegido.'Destination'blockproc

La firma del método es la siguiente:writeRegion

function [] = writeRegion(obj, region_start, region_data)

El primer argumento, , indica el primer píxel del bloque que escribe el método.region_startwriteRegion El segundo argumento, , contiene los nuevos datos que el método escribe en el archivo.region_data

Las clases que implementan el método pueden ser más complejas que .writeRegionLanAdapter Al crear un objeto de adaptador de imagen grabable, las clases a menudo tienen la responsabilidad adicional de crear nuevos archivos en el constructor de clase. Esta creación de archivos requiere una sintaxis más compleja en el constructor, donde es posible que necesite especificar el tamaño y el tipo de datos de un nuevo archivo que desea crear. Los constructores que crean nuevos archivos también pueden encontrar otros problemas, como permisos de archivo del sistema operativo o código de creación de archivos potencialmente difícil.

Uso de la clase LanAdapter conblockproc

Ahora que entiende cómo funciona la clase, puede usarla para mejorar las bandas visibles de un archivo LAN.LanAdapter Vea el ejemplo para ver cómo funciona la función con la clase.Estadísticas de cómputo para imágenes grandesblockprocLanAdapter

Consulte también

| |

Temas relacionados