Хочу реализовать аналогичную функцию matchTemplate, которая есть в openCV. Данная функция принимает на вход тип метода, который определяет меру схожести двух изображений. Методы CV_TM_SQDIFF, CV_TM_SQDIFF_NORMED, CV_TM_CCORR, CV_TM_CCORR_NORMED реализовала с помощью БПФ, используя библиотеку fftw.
Но как реализовать методы CV_TM_CCOEFF и CV_TM_CCOEFF_NORMED ума не приложу. При вычислении значения функции R(x, y) мы должны постоянно из значений изображения и шаблона вычитать среднее значения, полученное по размерам шаблона. Но как это сделать с помощью БПФ, если, грубо говоря, в частотной области мы просто перемножаем значения изображения и шаблона (плюс, минус аналогичные действия в зависимости от типа метода сравнения).
Чтобы было более понятен мой вопрос, думаю, стоит привести простой код: В пространственной области у меня метод, например, CV_TM_CCOEFF, выглядел бы так:
for(int j = 0; j < H-h; ++j){
for(int i = 0; i < W-w; ++i){
double avarageImage = 0, avarageTemplate = 0;
for(int y = j; y < j+h; ++y){
for(int x = i; x < i+w; ++x){
avarageImage += Image[x, y];
avarageTemplate += Template[x-i, y-j];
}
}
avarageImage /= (w*h);
avarageTemplate /= (w*h);
double s = 0;
for(int y = j; y < j+h; ++y){
for(int x = i; x < i+w; ++x){
s += (Image[x, y]-avarageImage)*(Template[x-i, y-j]-avarageTemplate);
}
}
// Ищем максимальное значение s и запоминаем i, j - это и будет у нас положение шаблона в изображении
}
}
В частотной области, грубо говоря, у нас остается только два внешних цикла, а два внутренних заменяется умножением Image на сопряженное Template. И тогда как быть с усреднением?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При определении функции с пустым телом, как правильнее написать её код и зависит ли от этого "логика" самой функции? Если разницы нет, то есть...
Изучая новый стандарт C++, натолкнулся на нововведение «шаблоны переменных»