0

我正在使用这篇文章:nonlingr as a font to understand non linear transformations,在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));
            }
        }

在 300x196 rgb 图像中应用此代码,无论我使用什么控制点,我得到的都是黑屏,很难找到有关这种变换的信息,搜索参数曲线我发现的只是如何绘制它们,不适用于图片。有人可以帮助我如何用贝塞尔曲线转换图像吗?

4

1 回答 1

0

恕我直言,将曲线应用于图像听起来就像使用 LUT。因此,您需要检查不同图像值的曲线值,然后将图像值与曲线上的值切换,因此,为图像中的每个可能值创建一个查找表(例如:0, 1,...,255,对于灰度值 8 位图像),即 2x256 矩阵,第一列具有从 0 到 255 的值,第二列具有曲线的值。

于 2017-06-27T12:52:59.847 回答