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.

Calcular estadísticas para imágenes grandes

Este ejemplo muestra cómo utilizar para calcular estadísticas de imágenes grandes y, a continuación, utilizar esa información para procesar con mayor precisión las imágenes blockwise.blockproc La función es muy adecuada para aplicar una operación a una imagen blockwise, ensamblar los resultados y devolverlos como una nueva imagen.blockproc Sin embargo, muchos algoritmos de procesamiento de imágenes requieren información "global" sobre la imagen, que no está disponible cuando solo 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 cargar 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 de gran tamaño mediante.Mejora de imágenes compuestas de color multiespectralblockproc Va a mejorar las bandas visibles del archivo ERDAS LAN.rio.lan Estos tipos de técnicas de procesamiento de bloques suelen ser más útiles para imágenes de gran tamaño, pero una imagen pequeña funcionará con el propósito de este ejemplo.

Paso 1: construye un compuesto de truecolor

Utilizando, leer los datos de, un archivo que contiene imágenes de Mapeador temático Landsat en el formato de archivo LAN ERDAS. tiene soporte incorporado para la lectura de archivos TIFF y JPEG2000 solamente.blockprocrio.lanblockproc Para leer otros tipos de archivos, debe escribir una clase de adaptador de imagen para admitir e/s para el formato de archivo concreto. En este ejemplo se utiliza una clase de adaptador de imagen precompilados, el, que admite la lectura de archivos LAN.LanAdapter Para obtener más información sobre cómo escribir las clases de adaptador de imagen, vea cómo se compiló la clase.el tutorial en la guía del usuarioLanAdapter

El formato ERDAS LAN 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 de en el ejemplo.paris.lanMejora de imágenes compuestas de color multiespectral La imagen RGB aparece apagada, con poco contraste.

Paso 2: mejore la imagen-primer intento

En primer lugar, intente estirar los datos a través del rango dinámico usando.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 estiramiento.stretchlim Puesto que cada bloque se ajusta aisladamente de sus vecinos, cada bloque está calculando diferentes límites 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 simplemente llamar para crear un histograma de imagen.imhist Una manera de construir incrementalmente el histograma es usar con una clase que sume los histogramas de cada bloque a medida que se desplaza 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 para.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 Histogramacumullator con BLOCKPROC

Ahora utilice la clase con para construir el histograma de la banda roja de datos en.HistogramAccumulatorblockprocrio.lan Puede definir un identificador de función para el que se invocará el método en cada bloque de datos.blockprocaddToHistogram Al visualizar 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 opaco.

% 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: mejore el compuesto truecolor con una extensión de contraste

Ahora puede realizar un estiramiento de contraste adecuado en la imagen. Para los flujos de trabajo convencionales en memoria, puede usar simplemente 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 completa.stretchlimblockproc

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

Primero computa los histogramas para las bandas verdes y azules.

% 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.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 estiramiento globales y utilírelos para ajustar la imagen de color verdadero.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 mejora mucho, con los datos que cubren más del rango dinámico, y mediante el uso de evitar la carga de toda la imagen en la memoria.blockproc

Consulte también

Clases

Funciones

Ejemplos relacionados

Más acerca de