algorytm.org

Transformacja HSV RGB



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Transformacja HSV RGB
Ocena użytkowników:***** / 18
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 06 września 2005 22:09

Przeważnie pisząc aplikację nie możemy korzystać bezpośrednio z modelu HSV, należy go zatem przetransformować do używanego powszechnie modelu RGB. Zakładamy przy tym, że parametry wejściowe mają wartości: H od 0.0 do 359.9, a S oraz V pomiędzy 0.0 a 1.0. Natomiast wartości składowych wynikowego modelu RGB mieszczą się w przedziałach od 0.0 do 1.0.

HSV do RGB
dane wejsciowe: hue, sat, val
dane wyjsciowe: red, grn, blu
if(val==0) {red=0; grn=0; blu=0;}
else{
 hue/=60;
 i = Math.floor(hue);
 f = hue-i;
 p = val*(1-sat);
 q = val*(1-(sat*f));
 t = val*(1-(sat*(1-f)));
 if (i==0) {red=val; grn=t; blu=p;}
 else if (i==1) {red=q; grn=val; blu=p;}
 else if (i==2) {red=p; grn=val; blu=t;}
 else if (i==3) {red=p; grn=q; blu=val;}
 else if (i==4) {red=t; grn=p; blu=val;}
 else if (i==5) {red=val; grn=p; blu=q;}
}

RGB do HSV
x = MIN(MIN(red, grn), blu);
val = MAX(MAX(red, grn), blu);
if (x == val) {hue=0; sat=0;}
else {
if red == x
 f = grn-blu
else
 if grn == x
   f = blu-red
 else
   f = red-grn;
if red == x
 i = 3
else
 if grn == x
   i = 5
 else
   i = 1;
 hue = ((i-f/(val-x))*60)%360;
 sat = ((val-x)/val);
}

Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiC/C++
.cpp
.cpp
***** / 11
Tomasz LubińskiDelphi/Pascal
.pas
.pas
***** / 2
Tomasz LubińskiJava
.java
.java
***** / 2
Nikodem SolarzRubyMetody przekształcające
.rb
.rb
***** / 0
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 30 lipca 2012 19:07
Komentarze
photo
-1 # Krystiann 2011-10-30 19:57
Czy moze ktos napisac dlaczego zmienne f oraz i przyjmują takie właśnie wartości i dlaczego tak a nie inaczej potem wychodzą nam h i s
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-1 # Cent 2012-10-16 21:30
UWAGA! NIE PRAWIDŁOWY ALGORYTM!!!
DOWÓD: DLA red=0, grn=1, blu=1 oraz red=0, grn=1, blu=0 wychodzi ten sam HUE (red==x dla obu przypadków)
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+2 # Tomasz Lubiński 2015-08-28 11:35
Nieprawda, algorytm jest poprawny:

1. Dla red=0, grn=1, blu=1 mamy:
x = 0
val = 1
f = 0
i = 3
hue = (3-0) * 60 = 180

2. Dla red=0, grn=1, blu=0 mamy:
x = 0
val = 1
f = 1
i = 3
hue = (3-1) * 60 = 120

Obliczone wartości hue nie są takie same. Dla red = x, wartość f obliczana jest jako różnica pomiędzy grn i blu, zatem w obu wypadkach jest ona inna i co za tym idzie obliczona wartość hue też jest inna.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz