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.

Realice el procesamiento de bloques en archivos de imagen en formatos no admitidos

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 es parte del software.ImageAdapterclase abstracta (MATLAB)Image Processing Toolbox™ Define la firma de los métodos que utiliza para e/s de archivo con imágenes en el disco.blockproc Puede asociar instancias de una clase de adaptador de imagen con un archivo y utilizarlas como argumentos para el procesamiento de bloques basado en archivos.blockproc

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

Aprender más sobre el formato de archivo LAN

Para entender cómo funciona la clase, primero debe conocer el formato de archivo LAN.LanAdapter Las imágenes de Mapeador temático Landsat se almacenan en el formato de archivo ERDAS LAN. Los archivos de ERDAS LAN contienen un encabezado de 128 bytes seguido de una o más bandas espectrales de datos, banda intercalada-por-línea (BIL), en orden de número de banda creciente. 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 del formato de archivo LAN define los primeros 24 bytes del encabezado del archivo como se muestra en la tabla.

Contenido del 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 envase del archivo (indicando la profundidad de bits)
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.

Analizar el encabezado

Normalmente, cuando se trabaja con archivos LAN, el primer paso es obtener más información sobre el archivo mediante el análisis del 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 envase:

    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. Leer el ancho y alto 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 como sigue:

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-by-512, de 7 bandas.rio.lan El tipo de paquete de 0 indica que cada ejemplo es un entero de 8 bits sin signo (tipo de datos).uint8

Al leer el archivo

En un flujo de trabajo típico en memoria, leería este archivo LAN utilizando 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 los archivos LAN muy grandes, sin embargo, leer y procesar toda la imagen en la memoria utilizando 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 sólo es compatible con la lectura y escritura de ciertos 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 ser capaz de:

  • Consulte el tamaño del archivo en el disco

  • Lea un bloque rectangular de datos del archivo

Si cumple estas dos condiciones, puede escribir una clase de adaptador de imagen para los archivos LAN. Puede analizar el encabezado de la imagen para consultar el tamaño del archivo, y puede 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

Examinando 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 prepararte para 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 las clases de escritura.Desarrollar 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 la clase e indica que hereda de la superclase.classdefLanAdapterImageAdapter Heredar de permite que la nueva clase:ImageAdapter

  • Interactúa 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 modificables 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 clase

El constructor de clase inicializa el objeto.LanAdapter El constructor analiza la información del encabezado del archivo LAN y establece las propiedades de la 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íxel utiliza estas propiedades. La propiedad le permite leer un subconjunto de las bandas, con el conjunto predeterminado 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: requerido

Las clases de adaptador tienen dos métodos requeridos 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 los bloques de datos de los archivos en el disco.blockprocreadRegion El segundo método, realiza cualquier limpieza necesaria del objeto de adaptador de imagen.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 manera diferente para diferentes formatos de archivo, dependiendo de qué herramientas están disponibles para la lectura de los archivos específicos.readRegion El método para la clase utiliza los argumentos de entrada para preparar la entrada personalizada para.readRegionLanAdaptermultibandread Para los archivos LAN, proporciona una forma cómoda 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 cerrar identificadores de archivos y realizar otras responsabilidades de limpieza de clases.close

Métodos (opcional)

Como está escrito, la clase sólo 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 un 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 suelen tener 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 potencialmente necesario 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 los permisos de archivo del sistema operativo o el código de creación de archivos potencialmente difícil.

El uso de la clase LanAdapter conblockproc

Ahora que entiendes cómo funciona la clase, puedes 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.Calcular estadísticas para imágenes grandesblockprocLanAdapter

Consulte también

| |

Temas relacionados