обнаружение фильтра - PullRequest
       16

обнаружение фильтра

1 голос
/ 01 апреля 2012

Я должен определить, какой фильтр использовался на случайном изображении - есть ли распространенный способ определения правильного (гауссовский, предвиттальный, трезвый, средний, ...) или было бы разумно кодировать какой-то видОбнаружение "грубой силы"?

Я пытался найти его с помощью Matlab, но я не знаю, как найти более эффективно .На данный момент это как найти иголку в стоге сена.Я также подумал об использовании некоторого bash-script и imagemagick, но это потребовало бы больших ресурсов.

Я подумал, что это не будет проблемой, но это очень трудоемко, чтобы угадать фильтр и попробовать его какэто

f = fspecial('gaussian', [3 3], 1);
res = imfilter(orginal, f);
corr2(res, pic);

1 Ответ

4 голосов
/ 01 апреля 2012

Пусть 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
...