Пусть f будет исходным изображением, g будет фильтрованным, а h фильтром, примененным к f , так что :
f * h = g
Передача этого значения в частотную область:
F.H = G, so H = G/F
Проблема в том, что инвертирование F ОЧЕНЬ чувствительно к шуму.
Как реализовать это в MATLAB:
close all;
f = imread('cameraman.tif');
[x,y] = size(f);
figure,imshow(f);
h = fspecial('motion', 20, 40); % abitrary filter just for testing the algorithm
F = fft2(f);
H = fft2(h,x,y);
G = F.*H;
g = ifft2(G); % the filtered image
figure, imshow(g/max(g(:)));
% Inverting the original image
epsilon = 10^(-10);
small_values = find(abs(F)<epsilon);
F(small_values) = epsilon;
F_i = ones(x,y)./F;
H_calculated = G.*F_i;
h_calculated = ifft2(H_calculated);
% remove really small values to try to infer the original size of h
r = sum(h_calculated,1)<epsilon;
c = sum(h_calculated,2)<epsilon;
h_real = h_calculated(~r,~c);
% Calculate error
% redo the filtering with the found filter
figure,g_comp = ifft2(fft2(f).*fft2(h_real,x,y));
imshow(g_comp/max(g_comp(:)));
rmse = sqrt(mean(mean((double(g_comp) - double(g)).^2,2),1))
edit : Просто, чтобы объяснить эпсилон часть:
Может быть, некоторые значения в F равны нулю или очень близки к нулю. Если мы попытаемся инвертировать F с этими маленькими значениями, у нас будут проблемы с бесконечностью. Самый простой способ решить эту проблему - обрезать каждое значение в F, которое меньше произвольно малого предела, epsilon в коде.
Математически, что было сделано, это:
For all F < epsilon, F = epsilon