Я использую эту статью: nonlingr как шрифт для понимания нелинейных преобразований, в разделе GLYPHS ALONG A PATH
он объясняет, как использовать параметрическую кривую для преобразования изображения, я пытаюсь применить кубический Безье к изображению, однако мне не удалось, это мой код:
OUT.aloc(IN.width(), IN.height());
//get the control points...
wVector p0(values[vindex], values[vindex+1], 1);
wVector p1(values[vindex+2], values[vindex+3], 1);
wVector p2(values[vindex+4], values[vindex+5], 1);
wVector p3(values[vindex+6], values[vindex+7], 1);
//this is to calculate t based on x
double trange = 1 / (OUT.width()-1);
//curve coefficients
double A = (-p0[0] + 3*p1[0] - 3*p2[0] + p3[0]);
double B = (3*p0[0] - 6*p1[0] + 3*p2[0]);
double C = (-3*p0[0] + 3*p1[0]);
double D = p0[0];
double E = (-p0[1] + 3*p1[1] - 3*p2[1] + p3[1]);
double F = (3*p0[1] - 6*p1[1] + 3*p2[1]);
double G = (-3*p0[1] + 3*p1[1]);
double H = p0[1];
//apply the transformation
for(long i = 0; i < OUT.height(); i++){
for(long j = 0; j < OUT.width(); j++){
//t = x / width
double t = trange * j;
//apply the article given formulas
double x_path_d = 3*t*t*A + 2*t*B + C;
double y_path_d = 3*t*t*E + 2*t*F + G;
double angle = 3.14159265/2.0 + std::atan(y_path_d / x_path_d);
mapped_point.Set((t*t*t)*A + (t*t)*B + t*C + D + i*std::cos(angle),
(t*t*t)*E + (t*t)*F + t*G + H + i*std::sin(angle),
1);
//test if the point is inside the image
if(mapped_point[0] < 0 ||
mapped_point[0] >= OUT.width() ||
mapped_point[1] < 0 ||
mapped_point[1] >= IN.height())
continue;
OUT.setPixel(
long(mapped_point[0]),
long(mapped_point[1]),
IN.getPixel(j, i));
}
}
Применяя этот код к изображению размером 300×196 RGB, все, что я получаю, это черный экран, независимо от того, какие контрольные точки я использую, трудно найти информацию о преобразовании такого типа, поиск параметрических кривых, все, что я нахожу, это как их нарисовать, а не применить к изображений. Может кто-нибудь помочь мне, как преобразовать изображение с кривой Безье?
ИМХО применение кривой к изображению звучит как использование LUT. Таким образом, вам нужно будет проверить значение кривой для различных значений изображения, а затем переключить значение изображения на одно значение на кривой, поэтому создайте таблицу соответствия для каждого возможного значения в изображении (например, 0, 1, …, 255 (для 8-битного изображения со значением серого), то есть матрицы 2х256, первый столбец имеет значения от 0 до 255, а второй — значение кривой.
Других решений пока нет …