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.

Operaciones de vecindario deslizante

Una operación de vecindad deslizante es una operación que se realiza un píxel a la vez, con el valor de cualquier píxel dado en la imagen de salida que se determina por la aplicación de un algoritmo a los valores de la vecindad del píxel de entrada correspondiente del píxel es algo conjunto de píxeles, definido por sus ubicaciones con respecto a ese píxel, que se llama el.neighborhood.center pixel El vecindario es un bloque rectangular, y a medida que se desplaza de un elemento al siguiente en una matriz de imagen, el bloque de vecindad se desliza en la misma dirección. (Para operar en una imagen un bloque a la vez, en lugar de un píxel a la vez, utilice la función de procesamiento de bloques distinta. Consulte para obtener más información.)Procesamiento de bloque diferenciado

La siguiente figura muestra los bloques de vecindad para algunos de los elementos en una matriz de 6 por 5 con bloques deslizantes de 2 por 3. El píxel central de cada vecindad se marca con un punto. Para obtener información sobre cómo se determina el píxel central, consulte.Determine el píxel del centro

Bloques de vecindad en una matriz de 6 por 5

Determine el píxel del centro

El píxel central es el píxel real de la imagen de entrada que procesa la operación. Si el vecindario tiene un número impar de filas y columnas, el píxel central está realmente en el centro de la vecindad. Si una de las dimensiones tiene incluso longitud, el píxel central está justo a la izquierda del centro o justo encima del centro. Por ejemplo, en un vecindario de 2 por 2, el píxel central es el superior izquierdo.

Para cualquier vecindad, el píxel central semn

floor(([m n]+1)/2)

En el bloque 2 por 3 que se muestra en la figura anterior, el píxel central es (1, 2) o el píxel en la segunda columna de la fila superior de la vecindad.

Algoritmo general de operaciones de vecindad deslizante

Para realizar una operación de vecindad deslizante,

  1. Selecciona un solo píxel.

  2. Determine la vecindad del píxel.

  3. Aplique una función a los valores de los píxeles de la vecindad. Esta función debe devolver un escalar.

  4. Busque el píxel en la imagen de salida cuya posición corresponde a la del píxel central de la imagen de entrada. Establezca este píxel de salida en el valor devuelto por la función.

  5. Repita los pasos del 1 al 4 para cada píxel de la imagen de entrada.

Por ejemplo, la función podría ser una operación de promedio que suma los valores de los píxeles de la vecindad y, a continuación, divide el resultado por el número de píxeles de la vecindad. El resultado de este cálculo es el valor del píxel de salida.

Comportamiento de relleno de borde en operaciones de vecindad deslizante

A medida que el bloque de vecindad se desliza sobre la imagen, es posible que falten algunos de los píxeles de una vecindad, especialmente si el píxel central está en el borde de la imagen. Por ejemplo, si el píxel central es el píxel en la esquina superior izquierda de la imagen, las vecindades incluyen los píxeles que no forman parte de la imagen.

Para procesar estos vecindarios, la vecindad deslizante de operaciones de los bordes de la imagen, por lo general con 0 '.pad En otras palabras, estas funciones procesan los píxeles del borde suponiendo que la imagen está rodeada por filas y columnas adicionales de 0. Estas filas y columnas no pasan a formar parte de la imagen de salida y se utilizan solo como partes de las vecindades de los píxeles reales de la imagen.

Implementación de filtrado lineal y no lineal como operaciones de vecindad deslizante

Puede usar operaciones de vecindad deslizantes para implementar muchos tipos de operaciones de filtrado. Un ejemplo de una operación de vecino deslizante es la convolución, que se utiliza para implementar el filtrado lineal. proporciona las funciones para realizar la convolución y la caja de herramientas proporciona la función.MATLAB®convfilter2imfilter Consulte para obtener más información sobre estas funciones.¿Qué es el filtrado de imágenes en el dominio espacial?

Además de la convolución, hay muchas otras operaciones de filtrado que puede implementar a través de vecindarios deslizantes. Muchas de estas operaciones son de naturaleza no lineal. Por ejemplo, puede implementar una operación de vecindad deslizante donde el valor de un píxel de salida es igual a la desviación estándar de los valores de los píxeles en la vecindad del píxel de entrada.

Para implementar una variedad de operaciones de vecindad deslizante, utilice la función. toma como argumentos de entrada una imagen, un tamaño de vecindad y una función que devuelve un escalar y devuelve una imagen del mismo tamaño que la imagen de entrada. calcula el valor de cada píxel en la imagen de salida pasando la vecindad del píxel de entrada correspondiente a la función.nlfilternlfilternlfilter

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 vecindarios rectangulares.nlfilter 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

Por ejemplo, este código calcula cada píxel de salida tomando la desviación estándar de los valores de la vecindad de 3 por 3 del píxel de entrada (es decir, el propio píxel y sus ocho vecinos contiguos).

I = imread('tire.tif'); I2 = nlfilter(I,[3 3],'std2');

También puede escribir código para implementar una función específica y, a continuación, usar esta función con.nlfilter Por ejemplo, este comando procesa la matriz en vecindarios de 2 por 3 con una función llamada.Imyfun.m La sintaxis es un ejemplo de un identificador de función.@myfun

I2 = nlfilter(I,[2 3],@myfun);

Si prefiere no escribir código para implementar una función específica, puede usar una función anónima en su lugar. En este ejemplo se convierte la imagen a clase porque la función de raíz cuadrada no está definida para el tipo de datos.doubleuint8

I = im2double(imread('tire.tif')); f = @(x) sqrt(min(x(:))); I2 = nlfilter(I,[2 2],f);

(Para obtener más información sobre los identificadores de función, consulte.Crear identificador de función (MATLAB) Para obtener más información acerca de las funciones anónimas, consulte.)Funciones anónimas (MATLAB)

En el ejemplo siguiente se usa para establecer cada píxel en el valor máximo en su vecindad 3 por 3.nlfilter

Nota

Este ejemplo sólo pretende ilustrar el uso de.nlfilter Para una manera más rápida de realizar esta operación máxima local, utilice.imdilate

I = imread('tire.tif'); f = @(x) max(x(:)); I2 = nlfilter(I,[3 3],f); imshow(I); figure, imshow(I2);

Cada píxel de salida establecido en valor de vecindad de entrada máxima