Main Content

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.

Estadísticas de cómputo para imágenes grandes

En este ejemplo se muestra cómo utilizar para calcular estadísticas a partir de imágenes grandes y, a continuación, usar esa información para procesar las imágenes con mayor precisión en bloque.blockproc La función es adecuada para aplicar una operación a una imagen en bloque, ensamblar los resultados y devolverlos como una nueva imagen.blockproc Muchos algoritmos de procesamiento de imágenes, sin embargo, requieren información "global" sobre la imagen, que no está disponible cuando solo se está considerando un bloque de datos de imagen a la vez. Estas restricciones pueden resultar problemáticas cuando se trabaja con imágenes demasiado grandes para cargarse completamente en la memoria.

En este ejemplo se realiza una tarea similar a la que se encuentra en el ejemplo, pero adaptada para imágenes grandes mediante .Mejora de las imágenes compuestas de color multiespectralblockproc Mejorará las bandas visibles del archivo LAN de Erdas.rio.lan Estos tipos de técnicas de procesamiento de bloques suelen ser más útiles para imágenes grandes, pero una imagen pequeña funcionará para el propósito de este ejemplo.

Paso 1: Construir un compuesto Truecolor

Usando , lea los datos de , un archivo que contenga imágenes de mapeador temático Landsat en el formato de archivo LAN de Erdas. tiene soporte integrado para leer archivos TIFF y JPEG2000 solamente.blockprocrio.lanblockproc Para leer otros tipos de archivos, debe escribir una clase Image Adapter para admitir E/S para su formato de archivo determinado. En este ejemplo se utiliza una clase de adaptador de imagen precompilada, la , que admite la lectura de archivos LAN.LanAdapter Para obtener más información sobre cómo escribir clases de adaptador de imagen, vea describir cómo se creó la clase.el tutorial de la Guía de usuariosLanAdapter

El formato LAN de Erdas contiene el espectro rojo, verde y azul visible en las bandas 3, 2 y 1, respectivamente. Se utiliza para extraer las bandas visibles en una imagen RGB.blockproc

% Create the LanAdapter object associated with rio.lan. input_adapter = LanAdapter('rio.lan');  % Select the visible R, G, and B bands. input_adapter.SelectedBands = [3 2 1];  % Create a block function to simply return the block data unchanged. identityFcn = @(block_struct) block_struct.data;  % Create the initial truecolor image. truecolor = blockproc(input_adapter,[100 100],identityFcn);  % Display the un-enhanced results. figure; imshow(truecolor); title('Truecolor Composite (Un-enhanced)');

La imagen truecolor resultante es similar a la del ejemplo.paris.lanMejora de las imágenes compuestas de color multiespectral La imagen RGB parece opaca, con poco contraste.

Paso 2: Mejorar la imagen - Primer intento

En primer lugar, intente estirar los datos en el rango dinámico mediante .blockproc Este primer intento simplemente define un nuevo identificador de función que llama y en cada bloque de datos individualmente.stretchlimimadjust

adjustFcn = @(block_struct) imadjust(block_struct.data,...     stretchlim(block_struct.data)); truecolor_enhanced = blockproc(input_adapter,[100 100],adjustFcn); figure imshow(truecolor_enhanced) title('Truecolor Composite with Blockwise Contrast Stretch')

Puede ver inmediatamente que los resultados son incorrectos. El problema es que la función calcula el histograma en la imagen de entrada y utiliza esta información para calcular los límites de extensión.stretchlim Puesto que cada bloque se ajusta de forma aislada de sus vecinos, cada bloque está calculando límites diferentes de su histograma local.

Paso 3: Examine la clase del acumulador de histograma

Para examinar la distribución de datos en el rango dinámico de la imagen, puede calcular el histograma para cada una de las tres bandas visibles.

Cuando se trabaja con imágenes suficientemente grandes, no se puede llamar simplemente para crear un histograma de imagen.imhist Una forma de construir incrementalmente el histograma es usarcon una clase que sumará los histogramas de cada bloque a medida que se mueve sobre la imagen.blockproc

Examine la clase.HistogramAccumulator

type HistogramAccumulator
% HistogramAccumulator Accumulate incremental histogram. %   HistogramAccumulator is a class that incrementally builds up a %   histogram for an image.  This class is appropriate for use with 8-bit %   or 16-bit integer images and is for educational purposes ONLY.  %   Copyright 2009 The MathWorks, Inc.  classdef HistogramAccumulator < handle         properties         Histogram         Range     end          methods                  function obj = HistogramAccumulator()             obj.Range = [];             obj.Histogram = [];         end                  function addToHistogram(obj,new_data)             if isempty(obj.Histogram)                 obj.Range = double(0:intmax(class(new_data)));                 obj.Histogram = hist(double(new_data(:)),obj.Range);             else                 new_hist = hist(double(new_data(:)),obj.Range);                 obj.Histogram = obj.Histogram + new_hist;             end         end     end end 

La clase es un contenedor simple alrededor de la función, lo que le permite agregar datos a un histograma de forma incremental.hist No es específico de .blockproc Observe el siguiente uso sencillo de la clase.HistogramAccumulator

% Create the HistogramAccumulator object. hist_obj = HistogramAccumulator();  % Split a sample image into 2 halves. full_image = imread('liftingbody.png'); top_half = full_image(1:256,:); bottom_half = full_image(257:end,:);  % Compute the histogram incrementally. addToHistogram(hist_obj, top_half); addToHistogram(hist_obj, bottom_half); computed_histogram = hist_obj.Histogram;  % Compare against the results of IMHIST. normal_histogram = imhist(full_image);  % Examine the results.  The histograms are numerically identical. figure subplot(1,2,1); stem(computed_histogram,'Marker','none'); title('Incrementally Computed Histogram'); subplot(1,2,2); stem(normal_histogram','Marker','none'); title('IMHIST Histogram');

Paso 4: Utilice la clase HistogramAccumulator con BLOCKPROC

Ahora use la clase con para construir el histograma de la banda roja de datos en .HistogramAccumulatorblockprocrio.lan Puede definir un identificador de función para que invocará el método en cada bloque de datos.blockprocaddToHistogram Al ver este histograma, puede ver que los datos se concentran dentro de una pequeña parte del rango dinámico disponible. Las otras bandas visibles tienen distribuciones similares. Esta es una de las razones por las que el compuesto truecolor original parece aburrido.

% Create the HistogramAccumulator object. hist_obj = HistogramAccumulator();  % Setup blockproc function handle addToHistFcn = @(block_struct) addToHistogram(hist_obj, block_struct.data);  % Compute histogram of the red channel.  Notice that the addToHistFcn % function handle does generate any output.  Since the function handle we % are passing to blockproc does not return anything, blockproc will not % return anything either. input_adapter.SelectedBands = 3; blockproc(input_adapter,[100 100],addToHistFcn); red_hist = hist_obj.Histogram;  % Display results. figure stem(red_hist,'Marker','none'); title('Histogram of Red Band (Band 3)');

Paso 5: Mejorar el verdadero color compuesto con un estiramiento de contraste

Ahora puede realizar un estiramiento de contraste adecuado en la imagen. Para flujos de trabajo convencionales en memoria, simplemente puede utilizar la función para calcular los argumentos (como hace el ejemplo).stretchlimimadjustMultispectralImageEnhancementExample Cuando se trabaja con imágenes grandes, como hemos visto, no se adapta fácilmente para su uso con ya que se basa en el histograma de imagen completo.stretchlimblockproc

Una vez que haya calculado los histogramas de imagen para cada una de las bandas visibles, calcule los argumentos adecuados a mano (similar a cómo lo hace).imadjuststretchlim

En primer lugar, calcule los histogramas para las bandas verde y azul.

% Compute histogram for green channel. hist_obj = HistogramAccumulator(); addToHistFcn = @(block_struct) addToHistogram(hist_obj, block_struct.data); input_adapter.SelectedBands = 2; blockproc(input_adapter,[100 100],addToHistFcn); green_hist = hist_obj.Histogram;  % Compute histogram for blue channel. hist_obj = HistogramAccumulator(); addToHistFcn = @(block_struct) addToHistogram(hist_obj, block_struct.data); input_adapter.SelectedBands = 1; blockproc(input_adapter,[100 100],addToHistFcn); blue_hist = hist_obj.Histogram;

Ahora calcule el CDF de cada histograma y prepárese para llamar a .imadjust

computeCDF = @(histogram) cumsum(histogram) / sum(histogram); findLowerLimit = @(cdf) find(cdf > 0.01, 1, 'first'); findUpperLimit = @(cdf) find(cdf >= 0.99, 1, 'first');  red_cdf = computeCDF(red_hist); red_limits(1) = findLowerLimit(red_cdf); red_limits(2) = findUpperLimit(red_cdf);  green_cdf = computeCDF(green_hist); green_limits(1) = findLowerLimit(green_cdf); green_limits(2) = findUpperLimit(green_cdf);  blue_cdf = computeCDF(blue_hist); blue_limits(1) = findLowerLimit(blue_cdf); blue_limits(2) = findUpperLimit(blue_cdf);  % Prepare argument for IMADJUST. rgb_limits = [red_limits' green_limits' blue_limits'];  % Scale to [0,1] range. rgb_limits = (rgb_limits - 1) / (255);

Cree un nuevo que aplique los límites de extensión globales y utilícelo para ajustar la imagen truecolor.adjustFcnblockproc

adjustFcn = @(block_struct) imadjust(block_struct.data,rgb_limits);  % Select full RGB data. input_adapter.SelectedBands = [3 2 1]; truecolor_enhanced = blockproc(input_adapter,[100 100],adjustFcn); figure; imshow(truecolor_enhanced) title('Truecolor Composite with Corrected Contrast Stretch')

La imagen resultante se ha mejorado mucho, con los datos que cubren más del rango dinámico, y al usar se evita cargar toda la imagen en la memoria.blockproc

Consulte también

Clases

Funciones

Ejemplos relacionados

Más acerca de