Я должен применить предварительный фильтр к изображению в частотной области. Вот процедура, которой я следую.
1) Преобразуйте матрицу изображения NxN в матрицу 2*Nx2*N, добавив нули
2) Центрируйте преобразование изображения, умножив изображение на (-1) ^ (x + y)
3) Вычислить ДПФ матрицы изображения
4) Создайте фильтр размерами 2Nx2N и центром в координатах (N,N)
5) Умножить матрицу изображения на матрицу фильтра
6) Рассчитайте обратное ДПФ и извлеките действительную часть результата.
7) Децентрализовать результат, умножив на (-1)^(x+y)
8) Наконец, извлеките верхнюю левую часть NxN результирующей матрицы.
Мой код ниже:
% mask=[-1,0,1;-1,0,1;-1,0,1];
%read image
signal=imread('cman.pgm');
signal=double(signal);
% image has NxN dimensions
l=size(signal,1);
pad_signal=zeros(2*l,2*l);
pad_signal(1:l,1:l)=signal;
m=size(mask,1);
mask_f=zeros(2*l,2*l);
for i=-1:1
mask_f(l+i,l-1)=-1;
mask_f(l+i,l+1)=1;
end
x=1:2*l;
[x y]=meshgrid(x,x);
% Multiply each pixel f(x,y) with (-1)*(x+y)
pad_signal=pad_signal.*((-1).^(x+y));
mask_f=myDFT(mask_f);
%find the DFT of image
signal_dft=myDFT(pad_signal);
%multiply the filter with image
res=mask_f*signal_dft;
% find the inverse DFT of real values of result
res=real(myIDFT(res));
res=res.*((-1).^(x+y));
%extract the upper left NxN portion of the result
res=res(1:l,1:l);
imshow(uint8(res));
Приведенный выше метод взят из книги по обработке изображений. Что меня смущает, так это то, должен ли я использовать окно 3x3, поскольку фильтр Prewitt имеет размер 3x3, или мой текущий способ использования фильтра правильный? (т.е. поместив значения фильтра в центр матрицы фильтра 2Nx2N и установив для всех остальных значений индекса значение 0) . Если нет ни одного из них, то как должен быть сформирован фильтр, чтобы его можно было умножить на т.п.п. изображения.