Обесцвечивание цветов в CTL

Нужно создать CTL с цветовым преобразованием, которое обесцвечивает пару противоположных цветов.

Мой пример ниже работает: но не так, как ожидалось:

__DEVICE__ float3 squeeze_GM(float percentage, float R, float G, float B) {
    float rOut = R - (((percentage/2) / 100) * R);
    float gOut = G - ((percentage / 100) * G);
    float bOut = B - (((percentage/2) / 100) * B);
    return make_float3(rOut, gOut, bOut);
}

__DEVICE__ float3 transform(int p_Width, int p_Height, int p_X, int p_Y, float p_R, float p_G, float p_B){
   float3 result = squeeze_GM(15, p_R, p_G, p_B);
   return result;
}

Я хотел бы сжать зеленый и пурпурный, чтобы обесцветить эти цвета на определенный процент, переданный функции squeeze_GM.

Есть ли у кого-нибудь подробности, как я могу получить это преобразование? На данный момент я думаю, что просто делаю значения RGB темнее на определенный процент. Нужно ли мне усреднять результаты R и B?


person hdcdigi    schedule 27.10.2020    source источник
comment
Преобразование из RGB в HSV, затем уменьшение насыщенности и обратное преобразование в RGB.   -  person Jabberwocky    schedule 27.10.2020
comment
Нужен ли мне условный оператор для угла оттенка? Поэтому мое преобразование применяется только к правильным значениям.   -  person hdcdigi    schedule 27.10.2020
comment
Извините, я не понял вопроса в вашем последнем комментарии. Но, может быть, я не понял обесцвечивание пары противоположных цветов в первую очередь. Вероятно, вам следует отредактировать вопрос и уточнить.   -  person Jabberwocky    schedule 27.10.2020


Ответы (1)


Найдите в Вики HUE
Идея может быть такой:

void HSV(uint8_t rgb[]){
 int32_t    r,g,b;
 int32_t    MaxVal,Minim,MedValue,MinValue;
 int32_t    Huecalc=0;

 r=rgb[0];
 g=rgb[1];  
 b=rgb[2];


 Minim=255;
 if(Minim>r)Minim=r;    //if red=128
 if(Minim>g)Minim=g;    //if green=200  
 if(Minim>b)Minim=b;    //if blue= 254
 // Minim = 128;

 MaxVal=0;
 if(MaxVal<r)MaxVal=r;      //if red=128    
 if(MaxVal<g)MaxVal=g;      //if green=200  
 if(MaxVal<b)MaxVal=b;      //if blue= 254  
 // MaxVal = 254

 MedValue=MaxVal-Minim;  // MedValue = 254-128 > 0
 MinValue=Minim;        // MinValue = 128   

 if(MedValue>0){
     if(MaxVal==r)Huecalc=0L*MedValue+(g-b);  // Wiki HUE THEORY explain this
     if(MaxVal==g)Huecalc=2L*MedValue+(b-r);
     if(MaxVal==b)Huecalc=4L*MedValue+(r-g);
     HUE=Huecalc*254/6/MedValue;                    // %254
 }

 if(MinValue>0){
   SAT=MedValue*254/MinValue;                   // %254
 }
}
person Lale    schedule 27.10.2020