使用贝塞尔曲线转换图像

时间:2017-06-27 12:38:11

标签: c++ image-processing cubic-bezier

我正在使用这篇文章: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图像中应用此代码我得到的是黑屏,无论我使用什么控制点,很难找到有关这种转换的信息,搜索参数曲线我发现的是如何绘制它们,不适用于图像。有人可以帮助我如何使用贝塞尔曲线转换图像吗?

1 个答案:

答案 0 :(得分:0)

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