Ланцошская интерполяция в C
Мне нужно реализовать следующую формулу в c-коде: https://en.wikipedia.org/wiki/Lanczos_resampling Поэтому я использую многомерный подход интерполяции:
где L(xi) или L(yi):
Я использую формат изображения 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-файл:
Спасибо!
1 ответ
Видите, вы не выполняете никакой интерполяции в своем коде.
Операция интерполяции выглядит так:
[input pixels
] => [Lanczos interpolation
] => [output interpolated pixels
]
|
|
V
a sum operation in the neighbourhood
of the corresponding location
in the input image
Ваши проблемы следующие:
- Вы не поняли
Lanczos interpolation technique
, На самом деле, кажется, вы не знаете, что такое интерполяция. - Ваш код не имеет
input pixels
иoutput pixels
, - Здесь нет
summation
в вашем коде. (Вы просто назначаете время для Ланцошаs_ij
вimg
пиксели. Сноваs_ij
это на самом делеinput
значения пикселей в формуле, но вы назначили фиксированное значение общего количества пикселей в изображенииs_ij
.) - Вы излишне использовали
floor(*)
функции.
Мое предложение для вас:
- Понять, что такое интерполяция алгоритмическим способом.
- Напишите алгоритм / псевдокод для любой вашей цели.
- Убедитесь, что вы правы в шагах 1 и 2.
- Тогда только попробуйте написать код.