Przelicz wartości RGB na zapis HSV

Ostatnia aktualizacja treści:

Wpisz trzy kanały RGB, a zapis HSV pojawi się w trakcie pisania: rgb(59, 130, 246) to hsv(217.2, 76%, 96.5%). Przełącznikiem Zapis HSV wybierzesz stopnie i procenty z programów graficznych, skalę OpenCV albo ułamki od 0 do 1, a kanały RGB zapisane ułamkami pole rozpozna samo.

Zapis HSV

Stopnie i procenty pokazują Photoshop i Figma. OpenCV zapisuje odcień od 0 do 179, a nasycenie i jasność od 0 do 255. Ułamki 0–1 zwracają colorsys w Pythonie i Unity.

na

Czym jest HSV i czym różni się od RGB?

RGB opisuje kolor ilością światła czerwonego, zielonego i niebieskiego, którą ekran wysyła w jednym punkcie. HSV opisuje ten sam kolor trzema cechami, które łatwiej sobie wyobrazić: odcieniem (H), czyli miejscem na kole barw zapisanym kątem od 0° do 360°, nasyceniem (S), czyli ilością koloru, oraz jasnością (V)[1].


Model zaproponował Alvy Ray Smith w 1978 roku. Chciał, żeby kolor na ekranie dobierało się tak, jak malarz miesza farby: wybiera czystą barwę, rozjaśnia ją bielą albo przyciemnia czernią. W jego modelu spadek nasycenia oznacza więcej bieli, a spadek jasności więcej czerni[2].


Ten sam model nosi też nazwę HSB, od angielskiego brightness[3]. Pod tą nazwą znajdziesz go w próbniku kolorów Photoshopa: barwa jest tam kątem od 0° do 360°, a nasycenie i jasność są podane w procentach[4]. Kanały RGB, od których zaczynasz, zapiszesz też jako kod szesnastkowy w konwerterze RGB na HEX.

Kolorowe karty z próbkami ułożone w koło na jasnym stole
Karty z próbkami kolorów ułożone w koło, od żółci przez zielenie i błękity po fiolety, róże i czerwienie. Miejsce karty na takim kole to w HSV pierwsza liczba, czyli odcień. Zdjęcie: Andy Brown, Unsplash.

Jeśli kolor masz w innym zapisie, na przykład w OKLCH, Lab albo jako kod z Androida, konwerter kolorów pokaże go naraz we wszystkich zapisach.

Jak przeliczyć RGB na HSV?

Podziel każdy kanał przez 255. Jasność V to największy z trzech wyników. Nasycenie S to różnica między największym a najmniejszym, podzielona przez największy. Odcień H zależy od tego, który kanał jest najmocniejszy[5].


Wzór: V = max, S = (max − min) ÷ max, a gdy najmocniejszy jest kanał niebieski, H = 240° + 60° × (R − G) ÷ (max − min). Przy najmocniejszym kanale czerwonym odcień liczy się od 0°, a przy zielonym od 120°[5].


Weźmy rgb(59, 130, 246). Po podzieleniu przez 255 kanały wynoszą 0,231, 0,510 i 0,965. Najwyższy jest niebieski, więc jasność to 96,5%. Różnica między największym a najmniejszym wynosi 0,733, a po podzieleniu przez 0,965 daje nasycenie 76%.


Odcień to 240° + 60° × (0,231 − 0,510) ÷ 0,733, czyli 240° − 22,8° = 217,2°. Cały kolor to hsv(217.2, 76%, 96.5%). Gdy wszystkie trzy kanały są równe, kolor jest szary, nasycenie wynosi 0, a odcień nie ma znaczenia[2], więc konwerter wpisuje w to miejsce 0.

Jakie wartości HSV mają podstawowe kolory?

Tabela pokazuje wynik konwertera dla dwunastu kolorów we wszystkich trzech zapisach, które daje przełącznik Zapis HSV.
Kolor i wartości RGBKod HEX0–360°, 0–100%OpenCV (0–179, 0–255)0–1
Czerwony 255, 0, 0#FF0000hsv(0, 100%, 100%)0, 255, 2550, 1, 1
Pomarańczowy 255, 165, 0#FFA500hsv(38.8, 100%, 100%)19, 255, 2550.1078, 1, 1
Żółty 255, 255, 0#FFFF00hsv(60, 100%, 100%)30, 255, 2550.1667, 1, 1
Zielony 0, 255, 0#00FF00hsv(120, 100%, 100%)60, 255, 2550.3333, 1, 1
Cyjan 0, 255, 255#00FFFFhsv(180, 100%, 100%)90, 255, 2550.5, 1, 1
Niebieski 0, 0, 255#0000FFhsv(240, 100%, 100%)120, 255, 2550.6667, 1, 1
Fioletowy 128, 0, 128#800080hsv(300, 100%, 50.2%)150, 255, 1280.8333, 1, 0.502
Magenta 255, 0, 255#FF00FFhsv(300, 100%, 100%)150, 255, 2550.8333, 1, 1
Biały 255, 255, 255#FFFFFFhsv(0, 0%, 100%)0, 0, 2550, 0, 1
Szary 128, 128, 128#808080hsv(0, 0%, 50.2%)0, 0, 1280, 0, 0.502
Czarny 0, 0, 0#000000hsv(0, 0%, 0%)0, 0, 00, 0, 0
Niebieski 59, 130, 246#3B82F6hsv(217.2, 76%, 96.5%)109, 194, 2460.6034, 0.7602, 0.9647
W zapisie OpenCV odcień jest połową kąta, żeby zmieścił się w jednym bajcie, dlatego niebieski ma 120, a nie 240. Nasycenie i jasność sięgają tam 255 zamiast 100%[5].

Jak zmienia się HSV, gdy dodajesz do koloru biel albo czerń?

Tabela miesza kolor rgb(59, 130, 246) z bielą i z czernią w krokach co 25%, a każdy wynik przelicza ten konwerter. Widać na niej zasadę Smitha: biel obniża nasycenie przy prawie tej samej jasności, a czerń obniża jasność przy prawie tym samym nasyceniu[2].
MieszaninaWartości RGBKod HEXHSV
75% bieli206, 224, 253#CEE0FDhsv(217, 18.6%, 99.2%)
50% bieli157, 193, 251#9DC1FBhsv(217, 37.5%, 98.4%)
25% bieli108, 161, 248#6CA1F8hsv(217.3, 56.5%, 97.3%)
Kolor wyjściowy59, 130, 246#3B82F6hsv(217.2, 76%, 96.5%)
25% czerni44, 98, 185#2C62B9hsv(217, 76.2%, 72.5%)
50% czerni30, 65, 123#1E417Bhsv(217.4, 75.6%, 48.2%)
75% czerni15, 33, 62#0F213Ehsv(217, 75.8%, 24.3%)
Odcień zostaje przy 217° w obu kierunkach. Różnice o ułamek stopnia biorą się z zaokrąglenia kanałów RGB do liczb całkowitych. Dlatego jaśniejszą albo ciemniejszą wersję koloru do palety wygodnie jest dobrać w HSV, zmieniając tylko jedną liczbę.

Jak odczytać wynik w Photoshopie, Figmie, OpenCV i Pythonie?

Każdy z tych programów zapisuje HSV w innej skali. Przy każdym podajemy opcję przełącznika Zapis HSV, która daje liczby w tej samej postaci.

  1. Photoshop

    W próbniku kolorów wpisz wynik w pola H, S i B. Barwa jest tam kątem od 0° do 360°, a nasycenie i jasność procentami[4], więc wybierz opcję 0–360°, 0–100%.
  2. Figma

    Na liście modeli pod suwakami próbnika wybierz HSB. Figma przyjmuje tu liczby całkowite: odcień od 0 do 360, nasycenie i jasność od 0 do 100[6]. Wynik z opcji 0–360°, 0–100% zaokrąglij więc do całości.
  3. OpenCV

    Obraz 8-bitowy po cv2.cvtColor(obraz, cv2.COLOR_RGB2HSV) ma odcień od 0 do 180 oraz nasycenie i jasność od 0 do 255[5]. Opcja OpenCV (0–179, 0–255) liczy to tym samym rachunkiem na liczbach całkowitych. Porównaliśmy ją z OpenCV.js 4.10 na wszystkich 16 777 216 kolorach i wynik był identyczny.
  4. Python i Unity

    Funkcja colorsys.rgb_to_hsv przyjmuje kanały od 0 do 1 i w tej samej skali zwraca wynik[7]. Color.RGBToHSV w Unity też podaje H, S i V od 0 do 1[8]. Obu odpowiada opcja 0–1.

Dlaczego OpenCV daje inny odcień niż konwerter?

Najczęściej dlatego, że OpenCV wczytuje zdjęcie z kanałami w kolejności niebieski, zielony, czerwony[9]. Obraz z cv2.imread przelicz więc stałą cv2.COLOR_BGR2HSV, a nie COLOR_RGB2HSV. Pomyłka zmienia sam odcień: te same trzy bajty 59, 130, 246 czytane jako BGR dają w OpenCV odcień 11 zamiast 109, czyli pomarańcz zamiast błękitu.


Druga pułapka dotyczy czerwieni. Leży ona na obu końcach skali odcienia, więc czysta czerwień ma w OpenCV odcień 0, a rgb(225, 0, 15), czerwień z lekką domieszką niebieskiego, już 178. Zakres, którym wybierasz czerwone piksele, musi zatem objąć oba końce skali.

Jakie zapisy wartości RGB obsługuje ten konwerter?

Każdy z tych zapisów pole przyjmuje i przelicza, więc nie trzeba niczego poprawiać przed wklejeniem. Tabela pokazuje, co konwerter robi z każdym z nich, a wyniki policzył on sam przy opcji 0–360°, 0–100%.
Co wpisujeszCo pokaże konwerterJak to czytamy
rgb(59, 130, 246)hsv(217.2, 76%, 96.5%)Zapis CSS z nawiasem przyjmujemy bez zmian.
59 130 246hsv(217.2, 76%, 96.5%)Trzy liczby rozdzielone spacjami wystarczą, bo nawiasy i przecinki nie są potrzebne.
R: 59, G: 130, B: 246hsv(217.2, 76%, 96.5%)Litery kanałów, tak jak zapisuje je księga znaku, pomijamy i bierzemy same liczby.
rgb(23.1%, 51%, 96.5%)hsv(217.2, 76%, 96.5%)Kanały podane w procentach przeliczamy sami na skalę od 0 do 255.
rgba(59, 130, 246, 0,5)hsva(217.2, 76%, 96.5%, 0.5)Krycie zapisane z przecinkiem dziesiętnym przenosimy do wyniku w postaci hsva.
0,2314 0,5098 0,9647hsv(217.2, 76%, 96.5%)Kanały zapisane jako ułamki od 0 do 1 poznajemy po przecinku i przeliczamy na skalę od 0 do 255.
(59, 130, 246)hsv(217.2, 76%, 96.5%)Krotkę, którą wypisuje Python, czytamy razem z nawiasem.
[59, 130, 246]hsv(217.2, 76%, 96.5%)Tablicę NumPy, którą wypisuje Python, czytamy razem z nawiasem kwadratowym.
background-color: rgb(59, 130, 246);hsv(217.2, 76%, 96.5%)Całą linię wklejoną z arkusza stylów przyjmujemy i wyjmujemy z niej sam kolor.
300, -20, 128hsv(329.9, 100%, 100%)Wartości spoza zakresu przycinamy tak samo jak przeglądarka: 300 do 255, a −20 do 0.

Konwertuj RGB na inne jednostki

Źródła

  1. HSV (grafika) — Wikipedia
  2. Color Gamut Transform Pairs (SIGGRAPH 78) — Alvy Ray Smith
  3. HSL and HSV — Wikipedia (wersja angielska)
  4. Wybieranie kolorów w programie Photoshop — Adobe
  5. Color conversions: RGB ↔ HSV — OpenCV
  6. About color models — Figma Help Center
  7. colorsys — Conversions between color systems — Python Software Foundation
  8. Color.RGBToHSV — Unity
  9. Image file reading and writing: imread — OpenCV
  10. Changing Colorspaces — OpenCV

Wszystkie wartości w tabelach wyliczyliśmy z definicji jednostek i sprawdziliśmy rachunkowo przed publikacją. Dane historyczne i nazwy lokalnych jednostek opieramy na źródłach wymienionych wyżej.

Ostatnia aktualizacja treści: · przygotował i sprawdził zespół Arteon

Najczęstsze pytania o przeliczanie RGB na HSV

Kiedy lepiej użyć HSV zamiast RGB?

Gdy wybierasz albo zmieniasz kolor według barwy, ilości koloru i jasności. W dokumentacji OpenCV czytamy, że kolor łatwiej opisać w HSV niż w BGR[10], dlatego HSV służy tam do wyszukiwania obiektów w danym kolorze. Arkusze stylów i pliki graficzne zapisują kolor zwykle w RGB albo w HEX, więc gotowy kolor przeliczasz na koniec z powrotem na kanały.

Czym HSV różni się od HSL?

Oba modele mają ten sam odcień, ale inaczej liczą pozostałe dwie liczby. W HSV czysta czerwień ma jasność 100%, czyli hsv(0, 100%, 100%), a w HSL jasność 50%, czyli hsl(0, 100%, 50%). Zapis HSL tego samego koloru poda konwerter RGB na HSL.

Jak przeliczyć kod HEX na HSV?

Zamień kod na trzy kanały w konwerterze HEX na RGB i wklej wynik tutaj. Pole przyjmie go razem z nawiasem rgb().

Czy konwerter zachowa krycie koloru?

Tak, w zapisie w stopniach i procentach krycie trafia do hsva(), a w zapisie 0–1 staje się czwartą liczbą. Zapis OpenCV krycie pomija, bo obraz HSV ma w OpenCV tylko trzy kanały.

Jak przeliczyć HSV z powrotem na RGB?

Wpisz wynik do konwertera HSV na RGB. Przycisk Zmień kolejność przeniesie Cię tam razem z bieżącym wynikiem.

Zrzut ekranu darmowego narzędzia Arteon: Przelicz wartości RGB na zapis HSV

Pomóż nam ulepszyć narzędzia

Masz pomysł na nową funkcję, widzisz błąd lub chcesz zaproponować inne narzędzie? Napisz do nas.