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 bloque diferenciado

En el procesamiento, se divide una matriz en-por-secciones.distinct blockmn Estas secciones, o bloques distintos, superponen la matriz de la imagen a partir de la esquina superior izquierda, sin solapamiento. Si los bloques no encajan 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 bloques de 4 por 8. Los bordes derecho e inferior tienen bloques parciales. Puede procesar bloques parciales tal cual, 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

Implemente 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 que especifique para el procesamiento.blockproc La función ensambla los bloques devueltos para crear una imagen de salida.blockproc

Por ejemplo, los comandos debajo de la imagen de proceso 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, vea.Crear identificador de función (MATLAB) Para obtener más información acerca de las funciones anónimas, consulte.)Funciones anónimas (MATLAB)

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

El ejemplo siguiente utiliza la función para establecer cada píxel en cada bloque 32-by-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 tiene 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 tengan el mismo tamaño.blockproc Si este es el resultado que desea, asegúrese de que la función que especifique devuelva 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 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 acerca de este enfoque, consulte.Utilice el procesamiento en columnas para acelerar la vecindad deslizante o las operaciones de bloque diferenciado

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, los bloques parciales se producen a lo largo de los bordes inferior y derecho de la imagen.Procesamiento de bloque diferenciado De forma predeterminada, estos bloques parciales se procesan tal cual, 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 tengan 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 manejador de funciones, 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 agregan al tamaño general 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 del 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 delinúa los nuevos contornos de la imagen después de que se haya agregado todo el relleno.

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