Promedio de máscara y máscara laplaciana en el procesamiento de imágenes
-
27-10-2019 - |
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?
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)) )
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
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:
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}
*)