HSV (grafika)
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 = record
red : byte;
green : byte;
blue : byte;
end;
THSV = record
hue : word; // przyjmuje wartości od 0 do 359
saturation : byte; // przyjmuje wartości od 0 do 100
value : byte; // przyjmuje wartości od 0 do 100
end;
Jako parametr funkcji podajemy wypełniony rekord typu TRGB, funkcja zwraca wypełniony rekord typu THSV.
function KonwertujRGBnaHSV(RGB : TRGB) : THSV;
var
temp : integer;
begin
temp := MIN(MIN(RGB.red, RGB.green), RGB.blue);
// Obliczanie składowej Value
Result.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 HUE
if temp = Result.value then
Result.hue := 0
else begin
if RGB.red=Result.value then
Result.hue := 0 + ((RGB.green-RGB.blue)*60 div (Result.value-temp));
if RGB.green=Result.value then
Result.hue := 120 + ((RGB.blue-RGB.red)*60 div (Result.value-temp));
if RGB.blue=Result.value then
Result.hue := 240 + ((RGB.red-RGB.green)*60 div (Result.value-temp));
end;
if Result.hue<0 then
Result.hue := Result.hue+360;
// Obliczanie składowej SATURATION
if (Result.value=0) then
Result.saturation := 0
else
Result.saturation := (Result.value-temp)*100 div Result.value;
// Obliczanie składowej VALUE
Result.value := (100*Result.value) div 255;
end;
Zobacz też
Przypisy
- ↑ Alvy Ray Smith. Color gamut transform pairs. „Computer Graphics”. 12 (3), s. 12–19, sierpień 1978. DOI: 10.1145/965139.807361.
- ↑ a b c d e Jankowski 1990 ↓, s. 229.
Bibliografia
- Michał Jankowski: Elementy grafiki komputerowej. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990. ISBN 83-204-1326-5.
Linki zewnętrzne
Media użyte na tej stronie
Autor: Wapcaplet, Licencja: CC-BY-SA-3.0
en:HSV color space visualization; HSV as a conical object. Created by Wapcaplet in the GIMP.