web-dev-qa-db-fra.com

Suppression du motif et du bruit dans une image à l'aide de FFT dans matlab

J'utilise l'image clown.jpg pour pouvoir me débarrasser du motif/du bruit évident dont il dispose. 

enter image description here

La première étape que j'ai faite avant de prendre FFT de l'image consiste à la redimensionner en une image carrée de puissances de deux (c'est-à-dire 256 x 256). L'utilisation de FFT et de ffthift dans matlab donne la transformation de Fourier rapide avec les intensités centrées dans l'image. L'image suivante est le résultat de l'utilisation des fonctions précédentes mentionnées.

enter image description here

J'ai réussi à supprimer le motif/bruit en mettant à zéro les "étoiles" manuellement sur l'image FFT comme indiqué ci-dessous:

enter image description here

En prenant l'IFFT, j'obtiens une bien meilleure qualité d'image (non représentée).

La question que je me pose est de savoir s’il existe un moyen automatisé de réduire à zéro les "étoiles"? J'ai créé un intervalle indiquant où mettre à zéro les images car nous ne souhaitons pas supprimer "l'étoile" la plus brillante, le composant DC, ni les valeurs faibles. Un tel seuil est donné ci-dessous:

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.

Le masque de sortie (que je vais multiplier en Image de Fourier) se trouve ci-dessous. Le noir correspond à la valeur 0 et le blanc à 1. Notez que le filtrage de ce masque supprime certaines "étoiles" et conserve une partie du composant DC. De toute évidence, cette méthode n’est pas la meilleure.

enter image description here

Je lisais à propos de faire un filtre passe-haut, mais cela semble supprimer toutes les valeurs extérieures de l'image de Fourier. Ceci est basé sur mes tests précédents (je n'ai pas inclus ces images). 

Recommandez-vous de mettre en surbrillance les valeurs d'intensité élevée, à l'exception du composant DC. Idéalement, j'aimerais que le masque ressemble à:

enter image description here

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

Dans un autre site, il a été mentionné d'utiliser "passe-haut et corrige le niveau des données FFT pour ne conserver que les points parasites qui représentent le modèle de trame". Je ne sais pas comment faire cela exactement. 

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

Votre aide sera grandement appréciée.

Voici mon code source pour vous aider:

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')
16
Luciano Rodriguez

J'ai essayé de détecter la magnitude maximale locale dans le domaine de fréquence et de les mettre à zéro avec leurs voisinages. Ce n'est pas tout à fait propre, mais réalisez au moins un zéro automatique dans une certaine mesure. enter image description here

Mon code:

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),
3
lennon310

j'ai récemment écrit mon filtre coupe-bande pour mes devoirs, j'ai eu du mal à trouver un exemple de code, voici mon code, j'espère qu'il vous aidera.

c'est un filtre idéal pour le rejet de l'encoche pour éliminer les bruits périodiques.

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,[]);
0
Murat Gümüş