una transformada señal ruido quitar fourier matlab design-patterns image-processing fft noise

transformada - quitar ruido de una señal matlab



Eliminación de patrones y ruido en una imagen usando FFT en matlab (2)

Estoy usando la imagen clown.jpg para poder eliminar el patrón / ruido obvio que tiene.

El primer paso que hice antes de tomar FFT de la imagen es reescalarla una imagen cuadrada de potencias de dos (es decir, 256 x 256). El uso de FFT y fftshift en matlab proporciona la transformación rápida de Fourier con las intensidades centradas en la imagen. La siguiente imagen es el resultado del uso de las funciones anteriores mencionadas.

Tuve éxito en eliminar el patrón / ruido poniendo a cero las "estrellas" manualmente en la imagen FFT como se muestra a continuación:

Tomando el IFFT obtengo una calidad de imagen mucho mejor (no se muestra).

La pregunta que tengo es si existe una forma automática de poner a cero las "estrellas". He creado un intervalo de donde poner a cero las imágenes, ya que no queremos eliminar la "estrella" más brillante, el componente DC, ni los valores bajos. Tal umbral se da a continuación:

filter = (fLog > .7*max(fLog(:)) ) | (fLog < .25*max(fLog(:)) ) where fLog is the log(1+abs(Fourier image)) and .7 and .25 are the corresponding interval percentages.

La máscara de salida (que multiplicaré a la imagen de Fourier) se encuentra a continuación. El negro corresponde al valor de 0 y el blanco corresponde a 1. Observe que el filtrado de esta máscara elimina algunas "estrellas" y conserva parte del componente de CC. Obviamente, este método no es el mejor.

Estaba leyendo acerca de hacer un filtro de paso alto, pero eso parece eliminar todos los valores externos en la imagen de Fourier. Esto se basa en mis pruebas previas (no incluí esas imágenes).

¿Hay algo que recomiende para resaltar los valores de alta intensidad excepto el componente de CC? Idealmente me gustaría que la máscara se vea así:

fuente: http://users.accesscomm.ca/bostrum/Imaging/tips/tip1.html

En otro sitio, se mencionó el uso de "paso alto y corrección de nivel de los datos de FFT para retener solo los puntos sueltos que representan el patrón de trama". No tengo claro cómo hacerlo exactamente.

fuente: http://www.robotplanet.dk/graphics/raster_removal/

Su ayuda será muy apreciada.

Aquí está mi código fuente para ayudar:

I = imread(''clown.jpg''); % Read Image % convert to grayscale I = rgb2gray(I); % normalize the image and conver to doubleI I = double(mat2gray(I)); % Resize the image I = imresize(I, [256 256]); % get the size of the image [rows,cols] = size(I); % apply FFT f = fftshift(fft2(I)); % used to plot the image fLog = log(1 + abs(f)); % filter by a range based on fLog filter = (fLog > .7*max(fLog(:)) ) | (fLog < .25*max(fLog(:)) ); B = abs(ifft2(f.*filter)); colormap(gray) subplot(2,2,1),imagesc(I); title(''Original Image'') subplot(2,2,2),imagesc(fLog); title(''Fourier Image'') subplot(2,2,3),imagesc(filter); title(''Zeroed Fourier Image'') subplot(2,2,4),imagesc(B); title(''Cleaned Image'') annotation(''textbox'', [0 0.9 1 0.1], ... ''String'', ''Fourier Analysis on Clown Image'', ... ''EdgeColor'', ''none'', ... ''HorizontalAlignment'', ''center'', ... ''FontSize'', 15, ... ''FontWeight'', ''bold'')


Recientemente escribí mi filtro de muesca para mi tarea, luché por encontrar un código de ejemplo, aquí está mi código, espero que sirva de ayuda. Gracias por todo.

es un filtro de rechazo de muesca ideal para eliminar ruidos periódicos.

I = imread(''clown.jpg''); %read image I = imresize(I, [256 256]); %resize image [m,n] = size(I);%get size of image as m and n [X,Y]=meshgrid(1:256,1:256); % it is a meshgrid for circle mask filter=ones(m,n); % filter initially only ones in it %according to notch filter equation it will find point on image is on imaginary circle.i found circle coordinates. for i=1:m-1 for j=1:n-1 d0 = i-130)^2 + (j-130)^2 <= 32^2 && (i-130)^2 + (j-130)^2 >=20^2; if d0 filter(i,j)=0; else filter(i,j)=1; end end end f = fftshift(fft2(I)); G = abs(ifft2(f.*filter)); figure(1),imshow(G,[]);


Traté de detectar la magnitud máxima local en el dominio de frecuencia y ponerlos a cero junto con sus vecindarios. No es exactamente limpio, pero al menos se da cuenta de algo de cero automático hasta cierto punto.

Mi código:

I=I-mean(I(:)); f = fftshift(fft2(I)); fabs=abs(f); roi=3;thresh=400; local_extr = ordfilt2(fabs, roi^2, ones(roi)); % find local maximum within 3*3 range result = (fabs == local_extr) & (fabs > thresh); [r, c] = find(result); for i=1:length(r) if (r(i)-128)^2+(c(i)-128)^2>400 % periodic noise locates in the position outside the 20-pixel-radius circle f(r(i)-2:r(i)+2,c(i)-2:c(i)+2)=0; % zero the frequency components end end Inew=ifft2(fftshift(f)); imagesc(real(Inew)),colormap(gray),