Свертка изображения в частотной области (MATLAB) - PullRequest
1 голос
/ 01 октября 2011

Я пишу программу на 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), чтобы получить «ту же самую» свертку в приближении БПФ.Я все еще хотел бы услышать от кого-то, кто более опытен, чем я, так что не отказывайтесь комментировать на основе этого обновления!

Ответы [ 2 ]

2 голосов
/ 01 октября 2011

MATLAB индексирует массивы от 1 до N.
Каноническое использование C (и большинство математических библиотек C-матриц) индексирует от 0 до N-1.Это может быть причиной разницы в единичных единицах.

Чтобы быть тождественным, алгоритм голого ifft (fft (x)) требует где-то масштабный коэффициент 1 / N.Некоторые библиотеки C помещают это 1 / N в fft ().Многие встраивают этот масштабный коэффициент в ifft ().Некоторые помещают 1 / sqrt (N) в обоих.Некоторые добавляют отсутствие встроенного масштабного коэффициента, требующего от пользователя масштабирования по мере необходимости, чтобы получить личность.

0 голосов
/ 28 апреля 2014

Вам нужно сдвинуть его на половину размера окна. В этом случае вы должны сделать: с = с (13: 256 + 12,13: 256 + 12); вместо: с = с (1: 256, 1: 256);

Вы дополняете сигнал нулями, но не используете его, поскольку принимаете сигнал от 1 до 256 - у вас все еще есть трэш по краям и ценный сигнал в правых углах, который вы теряете.

...