Как я умножаю спектры двух изображений различных размеров?

Вот решение с [1 115] селекторы CSS

::-webkit-input-placeholder { /* WebKit, Blink, Edge */
    color:    #909;
}
:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
   color:    #909;
   opacity:  1;
}
::-moz-placeholder { /* Mozilla Firefox 19+ */
   color:    #909;
   opacity:  1;
}
::-ms-input-placeholder { /* Microsoft Edge */
   color:    #909;
}
:-ms-input-placeholder { /* Internet Explorer 10-11 */
   color:    #909;
}
  • WebKit, Мигание (Safari, Google Chrome, Opera 15 +) и , Microsoft Edge использует псевдоэлемент:
    ::-webkit-input-placeholder.
  • Mozilla Firefox 4 to 18 использует псевдокласс:
    :-moz-placeholder (одно двоеточие).
    Mozilla Firefox 19 + использует псевдоэлемент:
    ::-moz-placeholder, но старый селектор будет все еще работать некоторое время.
  • Internet Explorer 10 и 11 используют псевдокласс:
    :-ms-input-placeholder.
  • Internet Explorer 9 и ниже не поддерживает атрибут заполнителя вообще, в то время как Opera 12 и ниже не поддерживает селектора CSS для заполнителей.
6
задан McM 3 September 2009 в 21:32
поделиться

2 ответа

Стандартный подход - заполнение меньшего массива (ядро свертки, y в вашем случае) нулями для соответствия размеру входного изображения (ваша матрица x). Это было бы ужасно неэффективным, если бы вы выполняли свертку в пространственной области, но если вы умножаете БПФ, это необходимо, и стоимость вычисления БПФ дополненного массива не так уж и велика. .

6
ответ дан 10 December 2019 в 00:41
поделиться

Вы правы, полагая, что два частотных интервала должны быть одинаковыми. Возьмем пример 1D (я использую синтаксис Matlab):

N = 4096;
M = 64;

x = randn(N, 1);
y = hann(M, 'symmetric');

zLinear = conv(x,y);
zCircular = ifft( fft(x) .* fft(y,N) );

disp(max(abs(zLinear(65:4096) - zCircular(65:4096))));

Разница между двумя методами составляет ~ 2e-14, поэтому ошибка округления. Обратите внимание, что вы должны пропустить первые 64 образца из-за разницы между линейной и круговой сверткой.

При вычислении zCircular обратите внимание на fft (y, N), который является синтаксисом Matlab для заполнения сигнала y нулями вверх к N перед расчетом fft. Это можно считать неэффективным с точки зрения использования памяти, но сравните скорость:

линейная свертка: 4096 умножений / сложений по 64 каждого = 262144 умножения / сложений

круговая свертка: 2 БПФ по 4096 + 1 комплексное умножение 2 * 4096 элементы + 1 обратный БПФ
= 3 * 4096 * log2 (4096) + 4096 * 6 = 172032 (при условии 6 операций для комплексного умножения)

По сути, скорость NlogN БПФ, даже когда вам нужно три из них, превосходит N * Операция свертки M, если M.

EDIT Добавить оценку скорости для случая 2D

Стоит добавить, что для 2D-данных преимущество в скорости увеличивается. Двумерное БПФ требует N * N * log2 (N * N) операций, поэтому умножение 3 БПФ + комплексное N ^ 2 массива для N = 4096 составляет 1,3e10 операций. Но прямая свертка составляет N ^ 2 * M ^ 2 = 6,9e10 операций, что примерно в 50 раз медленнее.

4
ответ дан 10 December 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: