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.

Procesamiento de bloques de imágenes grandes

En este ejemplo se muestra cómo realizar la detección de bordes en una imagen TIFF dividiendo la imagen en bloques. Cuando se trabaja con imágenes grandes, las técnicas normales de procesamiento de imágenes a veces pueden descomponerse. Las imágenes pueden ser demasiado grandes para cargarse en la memoria, o bien se pueden cargar en la memoria, pero luego ser demasiado grandes para procesar.

Para evitar estos problemas, puede procesar imágenes grandes de forma incremental: leer, procesar y, finalmente, volver a escribir los resultados en el disco, una región a la vez. el blockproc función le ayuda con este proceso. Mediante , especifique una imagen, un tamaño de bloque y un identificador de función. A continuación, divide la imagen de entrada en bloques del tamaño especificado, los procesa utilizando el identificador de función de un bloque a la vez y, a continuación, ensambla los resultados en una imagen de salida. devuelve la salida a la memoria o a un nuevo archivo en el disco.blockprocblockprocblockproc

En primer lugar, tenga en cuenta los resultados de realizar la detección de bordes sin procesamiento de bloques. En este ejemplo se utiliza una imagen pequeña, cameraman.tif, para ilustrar los conceptos, pero el procesamiento de bloques suele ser más útil para imágenes grandes.

file_name = 'cameraman.tif'; I = imread(file_name); normal_edges = edge(I,'canny');  imshow(I) title('Original Image')

figure imshow(normal_edges) title('Conventional Edge Detection')

Ahora intente la misma tarea mediante el procesamiento de bloques. La función tiene soporte integrado para imágenes TIFF, por lo que no tiene que leer el archivo completamente en la memoria utilizando .blockprocimread En su lugar, llame a la función utilizando el nombre de archivo de cadena como entrada. lee en un bloque a la vez, lo que hace que este flujo de trabajo sea ideal para imágenes muy grandes.blockproc

Al trabajar con imágenes grandes, a menudo utilizará el parámetro 'Destino' para especificar un archivo en el que escribirá la imagen de salida.blockproc Sin embargo, en este ejemplo devolverá los resultados a una variable, en memoria.

Este ejemplo utiliza un tamaño de bloque de [50 50]. En general, la elección de tamaños de bloque más grandes ofrece un mejor rendimiento para .blockproc Esto es especialmente cierto para los flujos de trabajo de archivo a archivo donde el acceso al disco incurrirá en un costo de rendimiento significativo. Los tamaños de bloque adecuados varían en función de los recursos de la máquina disponibles, pero probablemente deberían estar en el intervalo de miles de píxeles por dimensión.

% You can use an anonymous function to define the function handle. The % function is passed a structure as input, a "block struct", with several % fields containing the block data as well as other relevant information. % The function should return the processed block data. edgeFun = @(block_struct) edge(block_struct.data,'canny');  block_size = [50 50]; block_edges = blockproc(file_name,block_size,edgeFun);  figure imshow(block_edges) title('Block Processing - Simplest Syntax')

Observe los artefactos significativos del procesamiento de bloques. Determinar si un píxel es un píxel de borde o no requiere información de los píxeles vecinos. Esto significa que cada bloque no se puede procesar completamente por separado de sus píxeles circundantes. Para remediar esto, utilice el parámetro 'BorderSize' para especificar bordes verticales y horizontales alrededor de cada bloque.blockproc El 'BorderSize' necesario varía en función de la tarea que se está realizando.

border_size = [10 10]; block_edges = blockproc(file_name,block_size,edgeFun,'BorderSize',border_size);  figure imshow(block_edges) title('Block Processing - Block Borders')

Los bloques ahora se procesan con 10 píxeles adicionales de datos de imagen en cada lado. Esto se ve mejor, pero el resultado sigue siendo significativamente diferente del resultado original en memoria. La razón de esto es que el detector de borde Canny utiliza un umbral que se calcula en función del histograma de imagen completo. Puesto que la función llama a la función para cada bloque, el algoritmo Canny está trabajando con histogramas incompletos y, por lo tanto, utilizando umbrales variables a través de la imagen.blockprocedge

Al bloquear el procesamiento de imágenes, es importante comprender estos tipos de restricciones de algoritmo. Algunas funciones no se traducirán directamente al procesamiento de bloques para todas las sintaxis. En este caso, la función permite pasar un umbral fijo como argumento de entrada en lugar de calcularlo.edge Modifique el identificador de función para utilizar la sintaxis de tres argumentos de , y quite así una de las restricciones "globales" de la función.edge Algunos ensayos y errores encuentran que un umbral de 0.09 da buenos resultados.

thresh = 0.09; edgeFun = @(block_struct) edge(block_struct.data,'canny',thresh); block_edges = blockproc(file_name,block_size,edgeFun,'BorderSize',border_size);  figure imshow(block_edges) title('Block Processing - Borders & Fixed Threshold')

El resultado ahora coincide estrechamente con el resultado original en memoria. Puede ver algunos artefactos adicionales a lo largo de los límites. Estos se deben a los diferentes métodos de acolchado utilizados por el detector de bordes Canny. Actualmente, solo admite el relleno cero a lo largo de los límites de la imagen.blockproc

Consulte también

|

Ejemplos relacionados

Más acerca de