HSV (ang.Hue Saturation Value) – model opisu przestrzeni barw zaproponowany w 1978 roku przez Alveya Raya Smitha[1].
Model HSV nawiązuje do sposobu, w jakim widzi ludzki narząd wzroku, gdzie wszystkie barwy postrzegane są jako światło pochodzące z oświetlenia.
Według tego modelu wszelkie barwy wywodzą się ze światła białego, gdzie część widma zostaje wchłonięta, a część odbita od oświetlanych przedmiotów.
Symbole w nazwie modelu to pierwsze litery nazw angielskich dla składowych opisu barwy: H – odcień światła (ang. Hue) wyrażona kątem na kole barw przyjmująca wartości od 0° do 360°. Model jest rozpatrywany jako stożek, którego podstawą jest koło barw[2].
Wymiary stożka opisuje składowa S – nasycenie koloru (ang. Saturation) jako promień podstawy oraz składowa V – (ang.Value) równoważna nazwie B – moc światła białego (ang. Brightness) jako wysokość stożka.
Przyporządkowanie częstotliwości fal świetlnych na kole barw w modelu HSV jest takie samo jak w modelach HSL, tzn. centrum barwy czerwonej odpowiada kąt 0°[2] lub 360°[2]. Centrum barwy zielonej odpowiada kąt 120°[2]. Centrum barwy niebieskiej odpowiada kąt 240°[2]. Pozostałe barwy pośrednie dla składowej Hue są odpowiednio rozłożone pomiędzy kolorami czerwonym, zielonym i niebieskim.
Konwersja modelu RGB na HSV (Delphi/Object Pascal)
Aby zamienić składowe RGB na HSV, można skorzystać z poniższej funkcji konwertującej. Przy czym należy pamiętać, aby do listy używanych modułów włączyć moduł matematyczny (w Delphi do listy uses należy dodać moduł Math).
Rekordy TRGB i THSV mają następującą budowę:
TRGB=recordred:byte;green:byte;blue:byte;end;
THSV=recordhue:word;// przyjmuje wartości od 0 do 359saturation:byte;// przyjmuje wartości od 0 do 100value:byte;// przyjmuje wartości od 0 do 100end;
Jako parametr funkcji podajemy wypełniony rekord typu TRGB, funkcja zwraca wypełniony rekord typu THSV.
functionKonwertujRGBnaHSV(RGB:TRGB):THSV;vartemp:integer;begintemp:=MIN(MIN(RGB.red,RGB.green),RGB.blue);// Obliczanie składowej ValueResult.value:=MAX(MAX(RGB.red,RGB.green),RGB.blue);// Zmienna TEMP jest teraz najmniejszą składową, a zmienna Result.value największą składową// Obliczanie składowej HUEiftemp=Result.valuethenResult.hue:=0elsebeginifRGB.red=Result.valuethenResult.hue:=0+((RGB.green-RGB.blue)*60div(Result.value-temp));ifRGB.green=Result.valuethenResult.hue:=120+((RGB.blue-RGB.red)*60div(Result.value-temp));ifRGB.blue=Result.valuethenResult.hue:=240+((RGB.red-RGB.green)*60div(Result.value-temp));end;ifResult.hue<0thenResult.hue:=Result.hue+360;// Obliczanie składowej SATURATIONif(Result.value=0)thenResult.saturation:=0elseResult.saturation:=(Result.value-temp)*100divResult.value;// Obliczanie składowej VALUEResult.value:=(100*Result.value)div255;end;