Алгоритмы совмещения изображений - Двухлинейная интерполяция

ОГЛАВЛЕНИЕ

Двухлинейная интерполяция

В обоих алгоритмах используется двухлинейная интерполяция пикселя. Интерполяция помогает более точно вычислить интенсивность преобразованного пикселя. Преобразованные пиксели обычно имеют нецелые координаты, поэтому путем интерполяции их интенсивностей учитываются интенсивности соседних пикселей. Это также предотвращает колебания средней ошибки и повышает общую производительность уменьшения.

Используется шаблонная функция interpolate(), определенная в auxfunc.h:

// Интерполирует интенсивность пикселя с подпиксельной точностью.
// О двухлинейной интерполяции в Википедии:
// http://en.wikipedia.org/wiki/Bilinear_interpolation

template <class T>
float interpolate(IplImage* pImage, float x, float y)
{
    // Получить ближайшие целые координаты пикселя (xi;yi).
    int xi = cvFloor(x);
    int yi = cvFloor(y);

    float k1 = x-xi; // Коэффициенты для формулы интерполяции.
    float k2 = y-yi;

    int f1 = xi<pImage->width-1;  // Проверить, что пиксели справа
    int f2 = yi<pImage->height-1; // и ниже существуют.

    T* row1 = &CV_IMAGE_ELEM(pImage, T, yi, xi);
    T* row2 = &CV_IMAGE_ELEM(pImage, T, yi+1, xi);
                
    // Интерполировать интенсивность пикселя.
    float interpolated_value = (1.0f-k1)*(1.0f-k2)*(float)row1[0] +
                (f1 ? ( k1*(1.0f-k2)*(float)row1[1] ):0) +
                (f2 ? ( (1.0f-k1)*k2*(float)row2[0] ):0) +                        
                ((f1 && f2) ? ( k1*k2*(float)row2[1] ):0) ;

    return interpolated_value;

}

Заключение

Совмещение изображений имеет много применений в области машинного зрения, таких как отслеживание объектов. В данной статье были описаны два алгоритма совмещения изображений: поступательный аддитивный алгоритм Лукаса-Канаде и обратный композиционный алгоритм Бейкера-Деллаерта-Мэтьюса. Также был приведен исходный код C для этих алгоритмов.

Теперь сравнивается, какой алгоритм работает быстрее на Pentium IV 3 ГГц (конфигурация выпуска). Вводятся следующие компоненты вектора p:

-0.01 5 -3

Это значит, что изображение было перенесено на 5 пикселей вправо, на 3 пикселя вверх и немного повернуто (трудно назвать точный угол поворота).

Сводка для поступательного аддитивного алгоритма:

===============================================
Algorithm: forward additive.
Caclulation time: 0.157 sec.
Iteration count: 13
Approximation: wz_a=-0.007911 tx_a=4.893255 ty_a=-3.944573
Epsilon: 0.000010
Resulting mean error: 2.898076
===============================================

Сводка для обратного композиционного алгоритма:

===============================================
Algorithm: inverse compositional.
Caclulation time: 0.078 sec.
Iteration count: 11
Epsilon: 0.000010
Resulting mean error: 2.896847
===============================================

Время расчета для поступательного аддитивного алгоритма равно 0.157 сек. Время расчета для обратного композиционного алгоритма равно 0.078 сек. Выходит, обратный композиционный алгоритм работает быстрее, потому что он более эффективен вычислительно.