Ланцошская интерполяция в C

Мне нужно реализовать следующую формулу в c-коде: https://en.wikipedia.org/wiki/Lanczos_resampling Поэтому я использую многомерный подход интерполяции:

Многомерная интерполяция

где L(xi) или L(yi):

Lanczos Kernel

Я использую формат изображения ppm для получения значений rgb через небольшой скрипт. Это мой настоящий подход к Lanczos:

double _L(int param) {
    /*
    LANCZOS KERNEL
    */

    int a = 2; // factor "a" from formula
    if(param == 0) {

        return 1;
    }
    if(abs(param) > 0 && abs(param) < a) {

        return (a*sin(PI*param) * sin((PI*param)/a))/(PI*PI*param*param)
    }
    return 0;
}

void lanczos_interpolation(PPMImage *img) {

    if(img) {

        int start_i, start_j, limit_i, limit_j;
        int a = 2; // factor "a" from formula
        samples_ij = img->x*img->y; // "sij" from formula

        for(x = 0;x < img->x;x++) {

            for(y = 0;y = < img->y;y++) {

                start_i = floor(x)-a+1:
                limit_i = floor(x)+a;
                for(i = start_i;i <= limit_i;i++) {

                    start_j = floor(y)-a+1:
                    limit_j = floor(y)+a;
                    for(i = start_i;i <= limit_i;i++) {

                        img->data[x+(W*y)].red = (int)(samples_ij * _L(x-i) * _L(y-j)) // "_L" represents "L(x-i)" from formula
                        img->data[x+(W*y)].green = (int)(samples_ij * _L(x-i) * _L(y-j)) // "_L" represents "L(x-i)" from formula
                        img->data[x+(W*y)].blue = (int)(samples_ij * _L(x-i) * _L(y-j)) // "_L" represents "L(x-i)" from formula
                    }
                }
            }
        }
    }   
}

Эта часть кода меня сильно смутила:

img->data[x+(W*y)].red = (int)(samples_ij * _L(x-i) * _L(y-j)) // "_L" represents "L(x-i)" from formula
img->data[x+(W*y)].green = (int)(samples_ij * _L(x-i) * _L(y-j)) // "_L" represents "L(x-i)" from formula
img->data[x+(W*y)].blue = (int)(samples_ij * _L(x-i) * _L(y-j)) // "_L" represents "L(x-i)" from formula

Может ли кто-нибудь помочь мне справиться с этой интерполяцией Ланцоша в c? Вот мой полный C-файл:

http://pastebin.com/wdUHVh6U

Спасибо!

1 ответ

Видите, вы не выполняете никакой интерполяции в своем коде.

Операция интерполяции выглядит так:

[input pixels] => [Lanczos interpolation] => [output interpolated pixels]

                        |
                        |
                        V
        a sum operation in the neighbourhood 
            of the corresponding location
               in the input image

Ваши проблемы следующие:

  1. Вы не поняли Lanczos interpolation technique, На самом деле, кажется, вы не знаете, что такое интерполяция.
  2. Ваш код не имеет input pixels и output pixels,
  3. Здесь нет summation в вашем коде. (Вы просто назначаете время для Ланцоша s_ij в img пиксели. Снова s_ijэто на самом деле input значения пикселей в формуле, но вы назначили фиксированное значение общего количества пикселей в изображении s_ij.)
  4. Вы излишне использовали floor(*) функции.

Мое предложение для вас:

  1. Понять, что такое интерполяция алгоритмическим способом.
  2. Напишите алгоритм / псевдокод для любой вашей цели.
  3. Убедитесь, что вы правы в шагах 1 и 2.
  4. Тогда только попробуйте написать код.
Другие вопросы по тегам