J'utilise l'image clown.jpg pour pouvoir me débarrasser du motif/du bruit évident dont il dispose.
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.
J'ai réussi à supprimer le motif/bruit en mettant à zéro les "étoiles" manuellement sur l'image FFT comme indiqué ci-dessous:
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.
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 à:
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')
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.
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),
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,[]);