简体   繁体   English

RGB颜色映射到归一化值

[英]Rgb color map to a normalized value

I'm using this function to convert a normalized value between 0 and 1 to an RGB value depending on the JET colormap. 我正在使用此函数根据JET颜色图将0到1之间的标准化值转换为RGB值。

std::vector<double> mapJet(double v, double vmin, double vmax)
{
    if (v < vmin)
        v = vmin;

    if (v > vmax)
        v = vmax;

    double dr, dg, db;

    if (v < 0.1242) {
        db = 0.504 + ((1.-0.504) / 0.1242)*v;
        dg = dr = 0.;
    } else if (v < 0.3747) {
        db = 1.;
        dr = 0.;
        dg = (v - 0.1242) * (1. / (0.3747-0.1242));
    } else if (v < 0.6253) {
        db = (0.6253 - v) * (1. / (0.6253-0.3747));
        dg = 1.;
        dr = (v - 0.3747) * (1. / (0.6253-0.3747));
    } else if (v < 0.8758) {
        db = 0.;
        dr = 1.;
        dg = (0.8758 - v) * (1. / (0.8758-0.6253));
    } else {
        db = 0.;
        dg = 0.;
        dr = 1. - (v - 0.8758) * ((1.-0.504) / (1.-0.8758));
    }

    return std::vector<double> { 255 * dr, 255 * dg, 255 * db };
}

My aim is to find the function double v = mapJet_inv(R,G,B) . 我的目标是找到功能double v = mapJet_inv(R,G,B) That is to say, I convert an RGB color to a normalized value between 0 and 1 depending on the colormap. 也就是说,我将RGB颜色转换为0到1之间的归一化值,具体取决于颜色图。 I tried to start from the end of the mapJet function, however I didn't know how to specify the ranges of the RGB components. 我尝试从mapJet函数的末尾开始,但是我不知道如何指定RGB分量的范围。 Maybe I'm doing this badly. 也许我做得不好。 I will appreciate your help. 感谢您的帮助。 Thank you 谢谢

vector<float> colors_to_value(vector<float> colors_tab)
{

    double v ,db,dg,dr; v=db=dg=dr=0; vector<float> values_result;

    for(int i=0;i<colors_tab.size();i++)
    {
        dr=colors_tab(i,0)/255.;
        dg=colors_tab(i,1)/255.;
        db=colors_tab(i,2)/255.;

        if ( dg == 0.  &&  dr == 0. ) {
                v = (db - 0.504) / (1.-0.504) * 0.1242; // a revoir

        }
        else if ( db == 1.  &&  dr == 0. ) {
                v = dg/4. + 0.1242;
        }
        else if (db==0 && dr==1)
        {

            v   = 0.8758 -dg*(1. / (0.8758-0.6253)) ;
        }

        else if ( db==0 && dg ==0)
        {
            v    =( 1. - dr ) / ((1.-0.504) / (1.-0.8758)) +  0.8758;
        }
        else{

           float  val1= 0.6253 - db/(1. / (0.6253-0.3747)) ;
           float val2=dr/ (1. / (0.6253-0.3747)) + 0.3747;

             //  v=(val1+val2)/2.;
           if (val1>val2)
                   v=val1;
        }
        if(v<0) v=0;
        values_result.push_back(v);


    }


     return values_result;


}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM