Я пишу программу на c ++ для класса, который выполняет свертку в частотной области, и я заметил, что в конечном результате была ошибка в углу.Так что я попробовал это в MATLAB и получил точно такие же результаты.например,
Использование оператора из http://engronline.ee.memphis.edu/eece7214/images/Downlodable.htm
Я сделал
a = imread('cameraman.pgm');
h = ones(25,25)/25/25;
a(512,512) = 0;
h(512,512) = 0;
c = ifft2(fft2(a).*fft2(h))/256;
c = c(1:256, 1:256);
c = real(c);
imwrite(c,'test2.png')
Я посмотрел на c, прежде чем извлечь верхний левый угол, и я обнаружил, что это былотот же ответ, что и у imfilter (a, h), за исключением того, что он был переведен чуть-чуть из угла.Цифровая обработка изображений Гонсалесом ничего не говорит об этом, и у меня у меня на глазах кровь истекает поиском без всякой помощи (все повторяют те же инструкции, которые дает Гонсалес, чтобы извлечь верхний левый угол).
Не имеет отношения к основномувопрос, я также хотел бы знать, почему мне пришлось делить на 256 в этом коде MATLAB.В моем коде на C ++ мне не нужно было масштабировать результат, и я получил тот же ответ, что и этот код MATLAB.
edit: я немного поигрался с одномерными векторами (делая conv и ifft(fft * fft)), и я думаю, что «ошибка» связана с выводом, показывающим «полную» свертку в верхнем левом углу вместо «той же» свертки.Но даже если бы это было так, я не уверен, как детерминистически кодировать «извлечь эту часть только для того, чтобы получить« ту же самую »вместо верхней левой 256x256 части« полной »»
edit: Подробнеепоиск в Google привел к возможному решению с помощью http://jeremy.fix.free.fr/IMG/pdf/fftconvolution.pdf. В нем много математических символов, которых я никогда раньше не видел, но из того, что я могу извлечь, если вы собираете nxn и mxm, извлеките m: (m+ n-1), чтобы получить «ту же самую» свертку в приближении БПФ.Я все еще хотел бы услышать от кого-то, кто более опытен, чем я, так что не отказывайтесь комментировать на основе этого обновления!