2015-12-10 5 views
-1

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

Multidimensional interpolation

, где L (XI) или L (YI) является:

Lanczos Kernel

Я использую формат изображения частей на миллион, чтобы получить значения RGB корыта небольшой скрипт. Это мой фактический Ланцош подойти прямо сейчас:

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-File:

http://pastebin.com/wdUHVh6U

Спасибо!

+0

Я использовал алгоритм Ланцоса во время моей работы в высшем учебном заведении, и я думаю, что ваш вопрос может быть лучше на математическом сайте. Даже если у вас есть только вопрос реализации, для понимания кода требуется много знаний. –

+0

@TimBiegeleisen Это вопрос программирования, поэтому он лучше подходит для SO (этот сайт), IMHO. –

+0

@ KlasLindbäck Достаточно честный, у меня есть преимущество. –

ответ

2

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

операция интерполяции, как это:

[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 «s фактически являются input пиксельными значениями в формуле, но у вас есть присваивается фиксированное значением общего количества пикселей в изображении к s_ij.)
  4. Вы без необходимости использовали функции floor(*).

Мое предложение к вам:

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