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 distintos

En el procesamiento, se divide una matriz en secciones por.bloque distintomn Estas secciones, o bloques distintos, superponen la matriz de imágenes comenzando en la esquina superior izquierda, sin superposición. Si los bloques no caben exactamente sobre la imagen, puede agregar relleno a la imagen o trabajar con bloques parciales en los bordes derecho o inferior de la imagen. La siguiente figura muestra una matriz de 15 por 30 dividida en 4 por 8 bloques. Los bordes derecho e inferior tienen bloques parciales. Puede procesar bloques parciales tal como está, o puede rellenar la imagen para que el tamaño resultante sea 16 por 32. Para obtener más información, consulte .Aplicar relleno (Para operar en una imagen un píxel a la vez, en lugar de un bloque a la vez, utilice la función de procesamiento de vecindad deslizante. Para obtener más información, consulte .)Operaciones de vecindario deslizante

Imagen dividida en bloques distintos

Implementar el procesamiento de bloques mediante la función blockproc

Para realizar operaciones de bloque distintas, utilice la función.blockproc La función extrae cada bloque distinto de una imagen y lo pasa a una función especificada para su procesamiento.blockproc La función ensambla los bloques devueltos para crear una imagen de salida.blockproc

Por ejemplo, los siguientes comandos procesan la imagen en 25 por 25 bloques con la función .Imyfun En este caso, la función cambia el tamaño de los bloques para crear una miniatura.myfun (Para obtener más información acerca de los identificadores de función, consulte .Create Function Handle Para obtener más información acerca de las funciones anónimas, consulte .)Anonymous Functions

myfun = @(block_struct) imresize(block_struct.data,0.15); I = imread('tire.tif'); I2 = blockproc(I,[25 25],myfun);

Nota

Debido a los efectos de borde de bloque, cambiar el tamaño de una imagen utilizando no produce los mismos resultados que cambiar el tamaño de toda la imagen a la vez.blockproc

En el ejemplo siguiente se utiliza la función para establecer cada píxel de cada bloque 32 por 32 de una imagen en el promedio de los elementos de ese bloque.blockproc La función anónima calcula la media del bloque y, a continuación, multiplica el resultado por una matriz de unos, de modo que el bloque de salida tenga el mismo tamaño que el bloque de entrada. Como resultado, la imagen de salida tiene el mismo tamaño que la imagen de entrada. La función no requiere que las imágenes sean del mismo tamaño.blockproc Si este es el resultado que desea, asegúrese de que la función especificada devuelve bloques del tamaño adecuado:

myfun = @(block_struct) ...    uint8(mean2(block_struct.data)*...    ones(size(block_struct.data))); I2 = blockproc('moon.tif',[32 32],myfun); figure; imshow('moon.tif'); figure; imshow(I2,[]);

Nota

Muchas operaciones que se pueden implementar se ejecutan mucho más rápido si los cálculos se realizan en columnas de matriz en lugar de bloques rectangulares.blockproc Para obtener información sobre este enfoque, consulte .Utilice el procesamiento en columnas para acelerar las operaciones de vecindario deslizante o de bloques distintos

Aplicar relleno

Al procesar una imagen en bloques, es posible que desee agregar relleno por dos razones:

  • Para abordar la cuestión de los bloques parciales

  • Para crear bordes superpuestos

Como se describe en , si los bloques no caben exactamente sobre una imagen, se producen bloques parciales a lo largo de los bordes inferior y derecho de la imagen.Procesamiento de bloques distintos De forma predeterminada, estos bloques parciales se procesan tal como está, sin relleno adicional. Establezca el parámetro para rellenar los bordes derecho o inferior de la imagen y hacer que los bloques sean de tamaño completo.'PadPartialBlocks'true

También puede agregar bordes a cada bloque. Utilice el parámetro para especificar filas y columnas adicionales de píxeles fuera del bloque cuyos valores se tienen en cuenta al procesar el bloque.'BorderSize' Cuando hay un borde, pasa el bloque expandido, incluido el borde, a la función especificada.blockproc

Imagen dividida en bloques distintos con bordes especificados

Para procesar los bloques de la figura anterior con el identificador de función, la llamada es:myfun

B = blockproc(A,[4 8],myfun,'BorderSize',[1 2], ...    'PadPartialBlocks',true) 

Tanto el relleno de bloques parciales como los bordes de bloque se suman al tamaño total de la imagen, como se puede ver en la figura. La matriz original de 15 por 30 se convierte en una matriz de 16 por 32 debido al relleno de bloques parciales. Además, cada bloque de la imagen se procesa con un borde de 1 por 2 píxeles: un píxel adicional en los bordes superior e inferior y dos píxeles a lo largo de los bordes izquierdo y derecho. Los bloques a lo largo de los bordes de la imagen, expandidos para incluir el borde, se extienden más allá de los límites de la imagen original. Los píxeles de borde a lo largo de los bordes de la imagen aumentan el tamaño final de la matriz de entrada a 18 por 36. El rectángulo más externo de la figura delinea los nuevos límites de la imagen después de agregar todo el relleno.

De forma predeterminada, rellena la imagen con ceros.blockproc Si necesita un tipo diferente de relleno, utilice el parámetro de la función.blockproc'PadMethod'