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 está determinado por la aplicación de un algoritmo a los valores de la vecindad de un píxel de entrada correspondiente es algunos conjunto de píxeles, definido por sus ubicaciones en relación con ese píxel, que se denomina .Barrio.píxel central La vecindad es un bloque rectangular, y a medida que se mueve 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 distinto. Consulte para obtener más información.)Procesamiento de bloques distintos

La siguiente figura muestra los bloques de vecindad para algunos de los elementos de 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 .Determinar el píxel central

Bloques de vecindad en una matriz de 6 por 5

Determinar el píxel central

El píxel central es el píxel real de la imagen de entrada que está procesando la operación. Si la vecindad 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 una longitud uniforme, el píxel central está justo a la izquierda del centro o justo encima del centro. Por ejemplo, en una vecindad de 2 por 2, el píxel central es el superior izquierdo.

Para cualquier vecindad, el píxel central esmn

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 de la segunda columna de la fila superior de la vecindad.

Algoritmo general de operaciones de vecindario deslizante

Para realizar una operación de vecindario deslizante,

  1. Seleccione un solo píxel.

  2. Determinar 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 promediación que suma los valores de los píxeles de 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 bordes en las operaciones de vecindad deslizante

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

Para procesar estos barrios, deslizando las operaciones de vecindad de los bordes de la imagen, por lo general con 0.Almohadilla En otras palabras, estas funciones procesan los píxeles de borde suponiendo que la imagen está rodeada de filas y columnas adicionales de 0. Estas filas y columnas no pasan a formar parte de la imagen de salida y solo se utilizan 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 deslizante 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 y para realizar la convolución, y la caja de herramientas proporciona la función.MATLAB®convfilter2imfilter Consulte para obtener más información acerca de 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 vecindades 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 deslizantes, 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 de la imagen de salida pasando la vecindad del píxel de entrada correspondiente a la función.nlfilternlfilternlfilter

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 vecindades rectangulares.nlfilter Para obtener información sobre este enfoque, consulte .Utilice el procesamiento en columnas para acelerar las operaciones de vecindario deslizante o de bloques distintos

Por ejemplo, este código calcula cada píxel de salida tomando la desviación estándar de los valores de la vecindad 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, utilizar esta función con .nlfilter Por ejemplo, este comando procesa la matriz en 2 por 3 vecindades 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 en clase porque la función 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 .Create Function Handle Para obtener más información acerca de las funciones anónimas, consulte .)Anonymous Functions

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

Nota

Este ejemplo solo está pensado para ilustrar el uso de .nlfilter Para una forma 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 se establece en el valor máximo de vecindad de entrada