2013-12-11 2 views
13

Я использую изображение clown.jpg, чтобы иметь возможность избавиться от очевидного шаблона/шума, который он имеет.Удаление рисунка и шума в изображении с использованием FFT в matlab

enter image description here

Первый шаг, который я сделал, прежде чем принимать FFT этого изображения, чтобы изменить масштаб ему квадратное изображение полномочий двух (т.е. 256 х 256). Использование FFT и fftshift в matlab дает быстрое преобразование Фурье с интенсивностями, центрированными в изображении. Следующее изображение является результатом использования предыдущих упомянутых функций.

enter image description here

Я был успешным, чтобы удалить шаблон/шум обнуления «звезды» вручную на изображении FFT, как показано ниже:

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

В другом месте, было упомянуто использование «ФВЧ и уровень коррекции данных 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') 
+0

Вы знаете, где компоненты постоянного тока, почему бы не исключить их явно? –

+0

Это, кстати, довольно известный метод. См. Например, http://books.google.com/books?id=gxXXRJWfEsoC&pg=PA364&lpg=PA364#v=onepage&q&f=false Я еще не видел, как люди удаляют «звезды», но просто диск рядом с соответствующим место в fft. – tom10

+0

@MarkRansom Да, это правда, однако мне было интересно, есть ли какой-то код, который автоматизировал все. –

ответ

3

Я пытался обнаружить локальный максимум величины в частотной области, и нулю их вместе с их окрестностями. Это не совсем чисто, но, по крайней мере, реализовать некоторую автоматическую нуль. 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), 
+0

Очень интересный алгоритм. Он работает, используя квадраты в качестве маски. Не совсем то, что я искал, но это автоматический процесс. Благодарим вас за обмен. –

+0

Рассмотрите эффекты создания маски «тупых краев», когда вы это делаете. Это вызывает явление, называемое «звонком» в пространственной области. Вы всегда должны делать конические маски для вырезания частот в области преобразования. –

0

я недавно написал мой режекторный фильтр для моей домашней работы, я изо всех сил для поиска пример кода, вот мой код я надеюсь, что это будет helps.thanks для всех.

Это идеальный фильтр для удаления режекторных фильтров для удаления периодических шумов.

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,[]); 
Смежные вопросы