alexPec 3 November 29 Posted November 29 · Report post Всем доброго дня! Господа математики, помогите сделать быструю 2d свертку, что-то сходу не взлетает. Исходные данные: ч/б картинка = A(x,y), 128*128, 256 градаций яркости. Ядро свертки - 7*7 = B(x,y). Прогоняю обычную 2d свертку,получаю результат = T(x,y). Результат верный, т.к. совпадает с рассчитанным в сторонней программе. Берем его за эталон. Хочу сделать свертку по схеме T(x,y) = IFFT ( FFT(A(x,y)) * КС(FFT(B(x,y))) ), где КС - комплексно-сопряженные элементы. Вопросы вот в чем: 1. Если решать задачу "в лоб", т.е. находить FFT(B(x,y)), то получим матрицу 7*7. Каким образом ее умножать на матрицу FFT(A(x,y)) размерностью 128*128? Допустим, мы перед FFT(B(x,y)) расширяем матрицу B до размера 128*128 нулями. Где в этом случае (в каких координатах) ставить ядро свертки? Посредине? В координатах (0,0)? Будет ли такое преобразование (расширение нулями) математически эквивалентным свертке во временной области? 2. Умножение спектров FFT(A) * КС(FFT(B)) должно производится по правилу перемножения матриц или просто умножение соответствующих элементов? Пробовал уже всяко, математической эквивалентности (т.е. точно тех же результатов, что и со сверткой во временной области) так и не получил. Заранее благодарен за любую помощь! Quote Share this post Link to post Share on other sites More sharing options...
gridinp 4 November 29 Posted November 29 (edited) · Report post В OpenCV в описании функции cv::dft есть пример, функция: void convolveDFT(InputArray A, InputArray B, OutputArray C) там в всё подробно расписано Edited November 29 by gridinp Quote Share this post Link to post Share on other sites More sharing options...
alexPec 3 November 29 Posted November 29 · Report post Спасибо. Все получилось. Quote Share this post Link to post Share on other sites More sharing options...