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.

Bloque procesando imágenes grandes

Este ejemplo 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 imagen a veces pueden romperse. Las imágenes pueden ser demasiado grandes para cargar en la memoria, o bien se pueden cargar en la memoria, pero luego ser demasiado grande para procesar.

Para evitar estos problemas, puede procesar imágenes grandes de forma incremental: lectura, procesamiento y, finalmente, escribir los resultados de nuevo en el disco, una región a la vez. el blockproc función le ayuda con este proceso. Usar, especificar 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 mediante 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, considere 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 de gran tamaño.

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 utilizando el procesamiento de bloques. La función tiene soporte incorporado para las 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

Cuando trabaje con imágenes grandes, a menudo utilizará el parámetro ' Destination ' para especificar un archivo en el que se 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 produce un mejor rendimiento.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 apropiados varían en función de los recursos de la máquina disponibles, pero es probable que estén en el rango 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 adyacentes. 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 los 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 basado en el histograma de la imagen completa. 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

Cuando se procesan imágenes de bloque, 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 le permite pasar un umbral fijo como un argumento de entrada en lugar de calcularlo.edge Modifique el identificador de función para usar la sintaxis de tres argumentos y, por lo tanto, quite 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 son debido a los diferentes métodos de relleno utilizado por el detector de borde Canny. Actualmente, solo admite el relleno de cero a lo largo de los límites de la imagen.blockproc

Consulte también

|

Ejemplos relacionados

Más acerca de