Удаление рисунка и шума в изображении с использованием FFT в Matlab
Я использую образ clown.jpg, чтобы иметь возможность избавиться от очевидного шаблона/шума, который у него есть.
![enter image description here]()
Первый шаг, который я сделал до принятия БПФ изображения, - это перемасштабировать его квадратное изображение степеней двух (то есть 256 х 256). Использование FFT и fftshift в matlab дает быстрое преобразование Фурье с интенсивностями, центрированными в изображении. Следующее изображение является результатом использования предыдущих упомянутых функций.
![enter image description here]()
Мне удалось удалить шаблон/шум, обнуляя "звезды" вручную на изображении БПФ, как показано ниже:
![enter image description here]()
Принимая IFFT, я получаю гораздо лучшее качество изображения (не показано).
Вопрос, который у меня есть, заключается в автоматическом способе обнуления "звезд"? Я создал интервал, где нулевые изображения, поскольку мы не хотим удалять самую яркую "звезду", компонент постоянного тока или низкие значения. Такой порог приведен ниже:
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.
Маска вывода (которую я буду умножать на изображение Фурье) находится ниже. Черный соответствует значению 0, а белый соответствует 1. Обратите внимание, что фильтрация этой маски удаляет некоторые "звезды" и удерживает часть компонента постоянного тока. Очевидно, этот метод не самый лучший.
![enter image description here]()
Я читал о том, как делать фильтр высоких частот, но, похоже, удаляет все внешние значения в изображении Фурье. Это основано на моем предыдущем тестировании (я не включил эти изображения).
Есть ли что-то, что вы рекомендуете выделять значениями высокой интенсивности, за исключением компонента постоянного тока. В идеале я хотел бы, чтобы маску выглядела так:
![enter image description here]()
источник: http://users.accesscomm.ca/bostrum/Imaging/tips/tip1.html
На другом сайте было упомянуто, что "highpass и level корректируют данные FFT, чтобы сохранить только блуждающие точки, которые представляют растровый рисунок". Я не понимаю, как это сделать.
источник: http://www.robotplanet.dk/graphics/raster_removal/
Ваша помощь будет принята с благодарностью.
Вот мой исходный код:
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')
Ответы
Ответ 1
Я попытался обнаружить локальную максимальную величину в частотной области и обнулить их вместе с их окрестностями. Это не совсем чисто, но, по крайней мере, реализовать некоторую автоматическую нуль.
![enter image description here]()
Мой код:
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),
Ответ 2
Недавно я написал свой фильтр с надписями для своей домашней работы, я изо всех сил пытался найти пример кода, вот мой код, я надеюсь, что это поможет. Спасибо за все.
он является идеальным фильтром для удаления периодических шумов.
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,[]);