Растровое изображение цвета RGB и цвета с билинейной интерполяцией HSV

Я хочу использовать алгоритм преобразования значения цвета HSV в цвет RGB для вычисления растрового изображения RGB 200 x 200 с красными, зелеными, синими и белыми цветами в его углах и билинейно интерполированными цветами HSV в другом месте, а также вычислить растровое изображение с билинейно интерполированные цвета RGB. Я нашел формулу в wikipedia, но не понимаю, как это сделать.

Любая помощь будет оценена.


person kokosg    schedule 18.10.2012    source источник
comment
язык ? технологии? что-то реальное в качестве отправной точки?   -  person Ken    schedule 18.10.2012


Ответы (1)


Ладно, думаю, я знаю, к чему вы клоните. Я не пробовал запускать ничего из этого, так что, вероятно, в нем есть какие-то ошибки ...

Сначала вам нужно определить значения HSV для красного, зеленого, синего и белого цветов. Назовите их, по часовой стрелке, a, b, c, d - например, белый цвет будет [0,0,1] или что-то в этом роде.

Для позиции в сетке (x,y) с 0 <= x <= 1 Бит интерполяции похож на помещение значений в массив out:

for(int i=0; i<3; i++){
  out[i] = y*((x*a[i]) + ((1-x)*b[i])) + (1-y)*((x*d[i]) + ((1-x)*c[i]));
}

При нахождении линейно интерполированного значения доля x между A и B равна x*A + (1-x)*B. Просто сделайте это по одному разу для каждого направления.

Затем просто конвертируйте их в RGB, используя соглашение из статьи в Википедии.

void HSVtoRGB(double H, double S, double V, double[] out){
   double C = S*V;
   double H_prime = H/60; // a number in [0,3]
   double X = C*(1 - abs((H_prime%2)-1));

   // Do the big if bit
   switch((int)X){
     case 0:
       out[0] = C;
       out[1] = X;
       out[2] = 0;
     case 1:
       out[0] = X;
       out[1] = C;
       out[2] = 0;

      // etc etc

  }

  double m = V - C;
  for(int i=0; i<3; i++){
    out[i] += m;
  }
}

Это должно сделать это, плюс-минус. Ну, должно дать вам хотя бы приблизительное представление.

person Lucas    schedule 21.10.2012
comment
Спасибо за ваш ответ. Это было действительно полезно. - person kokosg; 21.10.2012