Алгоритм преобразования RGB в HSV и HSV в RGB в диапазоне 0-255 для обоих - PullRequest
75 голосов
/ 11 июня 2010

Я ищу преобразователь цветового пространства из RGB в HSV, специально для диапазона от 0 до 255 для обоих цветовых пространств.

Ответы [ 14 ]

0 голосов
/ 01 февраля 2018

Я создал, возможно, более быструю реализацию, используя диапазон 0-1 для RGBS и V и диапазон 0-6 для Хюэ (избегая деления), и сгруппировал случаи в две категории:

#include <math.h>
#include <float.h>

void fromRGBtoHSV(float rgb[], float hsv[])
{
//    for(int i=0; i<3; ++i)
//        rgb[i] = max(0.0f, min(1.0f, rgb[i]));

     hsv[0] = 0.0f;
     hsv[2] = max(rgb[0], max(rgb[1], rgb[2]));
     const float delta = hsv[2] - min(rgb[0], min(rgb[1], rgb[2]));

     if (delta < FLT_MIN)
         hsv[1] = 0.0f;
     else
     {
         hsv[1] = delta / hsv[2];
         if (rgb[0] >= hsv[2])
         {
             hsv[0] = (rgb[1] - rgb[2]) / delta;
             if (hsv[0] < 0.0f)
                 hsv[0] += 6.0f;
         }
         else if (rgb[1] >= hsv[2])
             hsv[0] = 2.0f + (rgb[2] - rgb[0]) / delta;
         else
             hsv[0] = 4.0f + (rgb[0] - rgb[1]) / delta;
     }    
}

void fromHSVtoRGB(const float hsv[], float rgb[])
{
    if(hsv[1] < FLT_MIN)
        rgb[0] = rgb[1] = rgb[2] = hsv[2];
    else
    {
        const float h = hsv[0];
        const int i = (int)h;
        const float f = h - i;
        const float p = hsv[2] * (1.0f - hsv[1]);

        if (i & 1) {
            const float q = hsv[2] * (1.0f - (hsv[1] * f));
            switch(i) {
            case 1:
                rgb[0] = q;
                rgb[1] = hsv[2];
                rgb[2] = p;
                break;
            case 3:
                rgb[0] = p;
                rgb[1] = q;
                rgb[2] = hsv[2];
                break;
            default:
                rgb[0] = hsv[2];
                rgb[1] = p;
                rgb[2] = q;
                break;
            }
        }
        else
        {
            const float t = hsv[2] * (1.0f - (hsv[1] * (1.0f - f)));
            switch(i) {
            case 0:
                rgb[0] = hsv[2];
                rgb[1] = t;
                rgb[2] = p;
                break;
            case 2:
                rgb[0] = p;
                rgb[1] = hsv[2];
                rgb[2] = t;
                break;
            default:
                rgb[0] = t;
                rgb[1] = p;
                rgb[2] = hsv[2];
                break;
            }
        }
    }
}

ДляДиапазон 0-255: * 255.0f + 0.5f и присвойте его неподписанному символу (или разделите на 255.0, чтобы получить противоположное).

0 голосов
/ 22 декабря 2017
How is this algorithm-

void RGB_to_HSV(float R, float G, float B){
    float H, S, V;
    float Max, Min;
    Max = max(R, G, B);
    Min= min(R, G, B);
    V= Max;

if(Max == 0){
  s=0;
}
else{
  s= Max-Min/Max;
}
if(s==0){
  H = undefined;
}
else{
  if(R == Max){
  H = (G-B)*60/Max-Min;
  if(H<0)
   H+ = 360;
}
elseif(G==Max){
    H = (B-R)*(60+120)/Max-Min;
}
else{
   H = (R-G)*(60+240)/Max-Min;
}
}
  printf('H S V');
}
0 голосов
/ 28 июля 2016

Вот тот, который я только что написал сегодня утром на основе почти такой же математики, что и выше:

0 голосов
/ 11 июня 2010

Эта ссылка содержит формулы для того, что вы хотите. Тогда это вопрос производительности (численные методы), если вы хотите быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...