Удаление периодического шума из изображения с помощью преобразования Фурье
Я выполняю 2D FFT на определенном изображении, и я получаю его спектральные компоненты. Теперь это изображение было наложено на другое изображение для создания периодического шума.
исходное изображение, а также периодическая версия шума показаны ниже:
Исходное Изображение
Периодическое Изображение Шума
чтобы отфильтровать это, я использовал ручные коробки, которые маскировались компоненты в спектре величины, которые являются довольно большими относительно других компонентов, как показано ниже.
после этого я выполняю обратный БПФ, но я не возвращаю исходное изображение.
кто-нибудь знает, что я делаю неправильно?
вот код, который маскирует значения, а затем переходит к обратному 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 ответов
фильтрация в частотной области-сложное дело, чтобы получить право. В вашем коде есть несколько ошибок, которые мешают вам восстановить исходное изображение:
вы применяете фильтрацию только на компоненте величины. Вы должны сделать это на оригинальный спектр изображения, не только компонент величины. Этот этап имеет важное значение для надлежащей реконструкции. BTW, для монетки термина обработки сигнала, что вы реализация-это notch filter или полосовой фильтр, который удаляет определенные частоты выбора.
вы центрировали спектр через
fftshift
но после того, как вы отфильтровали вы забыл отменить смену. Вы должны призватьifftshift
на результирующем отфильтрованном изображении, чтобы отменить центрирование.вы находите обратный БПФ log-transformed изображения. Помните, что выполнение преобразования log спектр только для отображения целей. Вы не используйте это при фильтрации или поиске обратного. Это даст вам непреднамеренные последствия, поскольку большая часть спектра была изменена из-за нелинейной операции. Вы должны сделать это на исходном спектре изображения.
незначительное примечание, но убедитесь, что вы звоните
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,[]);
я получаю это изображение:
довольно хорошая реконструкция исходного изображения, которое я добавлю. Вы еще увидите бит штриховатости и это сильно зависит от формы и размера фильтра зазубрины. Возможно, сделайте размер больше и даже больше, сделайте форму фильтра выемки круглой, а не квадратной. Это имеет тенденцию сохранять больше исходного изображения, поскольку жесткие края, введенные углами квадратов, имеют непреднамеренные эффекты звона.