我正在使用这篇文章:nonlingr作为理解非线性变换的字体,在GLYPHS ALONG A PATH
部分他解释了如何使用参数曲线转换图像,我&#39 ;我试图将立方贝塞尔应用于图像,但是我没有成功,这是我的代码:
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));
}
}
在300x196 rgb图像中应用此代码我得到的是黑屏,无论我使用什么控制点,很难找到有关这种转换的信息,搜索参数曲线我发现的是如何绘制它们,不适用于图像。有人可以帮助我如何使用贝塞尔曲线转换图像吗?
答案 0 :(得分:0)
IMHO将曲线应用于图像声音,就像使用LUT一样。因此,您需要检查不同图像值的曲线值,然后将图像值切换为曲线上的值,因此,为图像中的每个可能值创建一个查找表(例如:0, 1,...,255,对于灰度值8位图像),即2x256矩阵,第一列的值为0到255,第二列的值为曲线。