Pregunta

En una aplicación dada, aplico una máscara de promedio a las imágenes de entrada para reducir el ruido, y luego una máscara laplaciana para mejorar los pequeños detalles. ¿Alguien sabe si obtendría los mismos resultados si revertiría el orden de estas operaciones en MATLAB?

¿Fue útil?

Solución

Convolucionar con un núcleo laplaciano es similar a usar información derivada de la segunda sobre los cambios de intensidad. Dado que esta derivada es sensible al ruido, a menudo suavizamos la imagen con un gaussiano antes de aplicar el filtro laplaciano.


Aquí hay un ejemplo de matlab similar a lo que @Belisarius al corriente:

f='http://upload.wikimedia.org/wikipedia/commons/f/f4/Noise_salt_and_pepper.png';
I = imread(f);

kAvg = fspecial('average',[5 5]);
kLap = fspecial('laplacian',0.2);

lapMask = @(I) imsubtract(I,imfilter(I,kLap));

subplot(131), imshow(I)
subplot(132), imshow( imfilter(lapMask(I),kAvg) )
subplot(133), imshow( lapMask(imfilter(I,kAvg)) )

enter image description here

Otros consejos

Digamos que tiene dos filtros F1 y F2, y una imagen I. Si pasa su imagen a través de los dos filtros, obtendrá una respuesta que se definió como

X = ((I * F1) * F2)

Donde aquí estoy usando * representar circunvolución.

Por la regla asociativa de convolución, esto es lo mismo que.

X = (I * (F1 * F2))

Usando la conmutatividad, podemos decir que

X = (I * (F2 * F1)) = ((I * F2) * F1)

Por supuesto, esto está en el agradable dominio continuo de las matemáticas, hacer estas cosas en una máquina significa que habrá errores de reducción y se pueden perder algunos datos. También debe pensar si sus filtros son ABETO, De lo contrario, todo el concepto de pensar en el filtrado digital como una especie de convolución comienza a descomponerse, ya que su filtro realmente no puede comportarse de la manera que quería.


EDITAR

La convolución discreta se define como

conv2 uses a straightforward formal implementation of the two-dimensional convolution equation in spatial form

Por lo tanto, agregar ceros en los bordes de sus datos no cambia nada en un sentido matemático.

Como algunas personas han señalado, obtendrá diferentes respuestas numéricamente, pero esto se espera cuando tratemos con la calculación de los datos reales. Estas variaciones deben ser pequeñas y limitadas a los componentes de baja energía de la salida de la convolución (es decir: los bordes).

También es importante considerar cómo funciona la operación de convolución. Convolucionar dos conjuntos de datos de longitud X y longitud Y dará como resultado una respuesta que es X+Y-1 en longitud. Hay algo de magia detrás de escena para programas como Matlab y Mathematica para darle una respuesta de longitud X o Y.

Entonces, en lo que respecta a la publicación de @Belisarius, parece que realmente estamos diciendo lo mismo.

Numéricamente, los resultados no son los mismos, pero las imágenes se ven bastante similares.

Ejemplo en Mathematica:

enter image description here

Editar

Como respuesta al comentario de @thron en su respuesta sobre la conmutación de filtros lineales y relleno, solo considere las siguientes operaciones.

Mientras que la conmutación de un filtro gaussiano y laplaciano sin relleno es cierta:

list = {1, 3, 5, 7, 5, 3, 1};
gauss[x_] := GaussianFilter[ x, 1]
lapl[x_] := LaplacianFilter[x, 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]
(*
->{5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}    
  {5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}
*)

Haciendo lo mismo con el relleno, lo que resulta en una diferencia en los bordes:

gauss[x_] := GaussianFilter[ x, 1, Padding -> 1]
lapl[x_] := LaplacianFilter[x, 1, Padding -> 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]

(*
->{4.68233,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.68233}
  {4.58295,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.58295}
*)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top