Удаление периодического шума из изображения с помощью преобразования Фурье

Я выполняю 2D FFT на определенном изображении, и я получаю его спектральные компоненты. Теперь это изображение было наложено на другое изображение для создания периодического шума.

исходное изображение, а также периодическая версия шума показаны ниже:

Исходное Изображение

enter image description here

Периодическое Изображение Шума

enter image description here

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

enter image description here

после этого я выполняю обратный БПФ, но я не возвращаю исходное изображение.

enter image description here

кто-нибудь знает, что я делаю неправильно?

вот код, который маскирует значения, а затем переходит к обратному 2D FFT на маскируемом спектральном изображении:

pat1 = imread('Pattern1.png');

spec_orig = fft2(double(pat1));     
spec_orig2 = abs(spec_orig); 
spec_img = fftshift(spec_orig2);

for j = 115:125
    for n = 96:106
        spec_img(n,j) = 0; 
    end
    for n = 216:226
        spec_img(n,j) = 0; 
    end
    for n = 274:284
        spec_img(n,j) = 0; 
    end
    for n = 298:308
        spec_img(n,j) = 0; 
    end
    for n = 12:22
        spec_img(n,j) = 0; 
    end
    for n = 37:47
        spec_img(n,j) = 0; 
    end
end

%Getting Back the Image for Pattern1
figure;subplot(2,1,1);
spec_img = log(1 + spec_img);
imshow(spec_img,[]); 

subplot(2,1,2);
ptnfx = ifft2(spec_img);
imshow(ptnfx);

2 ответов


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

  1. вы применяете фильтрацию только на компоненте величины. Вы должны сделать это на оригинальный спектр изображения, не только компонент величины. Этот этап имеет важное значение для надлежащей реконструкции. BTW, для монетки термина обработки сигнала, что вы реализация-это notch filter или полосовой фильтр, который удаляет определенные частоты выбора.

  2. вы центрировали спектр через fftshift но после того, как вы отфильтровали вы забыл отменить смену. Вы должны призвать ifftshift на результирующем отфильтрованном изображении, чтобы отменить центрирование.

  3. вы находите обратный БПФ log-transformed изображения. Помните, что выполнение преобразования log спектр только для отображения целей. Вы не используйте это при фильтрации или поиске обратного. Это даст вам непреднамеренные последствия, поскольку большая часть спектра была изменена из-за нелинейной операции. Вы должны сделать это на исходном спектре изображения.

  4. незначительное примечание, но убедитесь, что вы звоните real после фильтрации результата после того, как вы берете обратный БПФ. Есть, скорее всего, некоторые остаточные мнимые компоненты, которые обусловлены вычислительными ошибками с плавающей запятой и поэтому вызывают real будет извлекать только реальные компоненты сигнала.

С этими исправлениями, это код у меня есть. Я прочитал ваше изображение непосредственно из StackOverflow, чтобы быть воспроизводимым:

pat1 = imread('http://i.stack.imgur.com/oIumJ.png');

%// Change
spec_orig = fft2(double(pat1)); 
spec_img = fftshift(spec_orig);

for j = 115:125
    for n = 96:106
        spec_img(n,j) = 0; 
    end
    for n = 216:226
        spec_img(n,j) = 0; 
    end
    for n = 274:284
        spec_img(n,j) = 0; 
    end
    for n = 298:308
        spec_img(n,j) = 0; 
    end
    for n = 12:22
        spec_img(n,j) = 0; 
    end
    for n = 37:47
        spec_img(n,j) = 0; 
    end
end

%// Change
ptnfx = real(ifft2(ifftshift(spec_img)));
imshow(ptnfx,[]);

я получаю это изображение:

enter image description here

довольно хорошая реконструкция исходного изображения, которое я добавлю. Вы еще увидите бит штриховатости и это сильно зависит от формы и размера фильтра зазубрины. Возможно, сделайте размер больше и даже больше, сделайте форму фильтра выемки круглой, а не квадратной. Это имеет тенденцию сохранять больше исходного изображения, поскольку жесткие края, введенные углами квадратов, имеют непреднамеренные эффекты звона.


вы должны использовать "ifftshift" при преобразовании изображения в пространственный домен.