Wpisany przez Tomasz Lubiński
czwartek, 19 sierpnia 2010 08:35
Akcent kolorystyczny, czy też akcent koloru (ang. color accent), jest efektem, w którym wszystkie szczegóły na obrazie poza jednym kolorem pozostają w odcieniach szarości. Zadanie to łatwo jest wykonać posługując się modelem HSV. Składowa h w tym modelu przyjmuje wartości od 0 do 359.99... i niesie ze sobą informację o kolorze. By wykonać akcent kolorystyczny, należy zatem dla każdego punktu obrazu odczytać jego wartość h w modelu HSV (w tym celu najczęściej potrzebna będzie konwersja z modelu RGB, w którym najczęściej przechowywane są obrazy na model HSV). Jeżeli odczytana wartość h jest równa wartości koloru, który chcemy zaakcentować wówczas, do obrazu wynikowego przenosimy ten punkt bez zmian, w przeciwnym wypadku zamieniamy ten punkt, na punkt w skali szarości.
By móc zaakcentować całe przedmioty w danym kolorze, musimy zaakcentować nie dokładnie jedną wartość h, ale cały przedział. Czyli wybieramy kolor, który chcemy zaakcentować, niech będzie to haccent, oraz szerokość przedziału range. Zatem przedział, w którym będziemy akcentować kolor (przenosić punkty obrazu bez zmian) będzie wynosić od h1 = (haccent - range/2 + 360) mod 360 do h2 = (haccent + range/2) mod 360.
By móc zaakcentować całe przedmioty w danym kolorze, musimy zaakcentować nie dokładnie jedną wartość h, ale cały przedział. Czyli wybieramy kolor, który chcemy zaakcentować, niech będzie to haccent, oraz szerokość przedziału range. Zatem przedział, w którym będziemy akcentować kolor (przenosić punkty obrazu bez zmian) będzie wynosić od h1 = (haccent - range/2 + 360) mod 360 do h2 = (haccent + range/2) mod 360.
Operacje modulo 360 wprowadzone są ponieważ h w modelu HSV opisuje funckję koła, zatem jeżeli przy dodawaniu przekraczamy wartość 359.99... to znajdujemy się z powrotem w 0, podobnie przy odejmowaniu jeżeli przekraczamy 0 to znajdujemy się w 359.99...
Z tego też powodu przy obliczaniu zakresu akcentu możemy natrafić na dwa przypadki:
- h1 ≤ h2, wówczas punkt zostaje zaakcentowany (przpisany do obrazu wynikowego bez zmian) jeżeli jego h wynosi, h1 ≤ h oraz h2 ≥ h,
- h1 > h2, wówczas punkt zostaje zaakcentowany (przpisany do obrazu wynikowego bez zmian) jeżeli jego h wynosi, h1 ≤ h lub h2 ≥ h.
Na przykład jeżeli haccent jest równe 250 i szerokość przedziału jest równa 20 to h1 = 240, h2 = 260 zatem zaakcentowane będą wszystkie punkty o wartościach h pomiędzy 240 a 260. Natomiast jeżeli haccent jest równe 355 a szerokość przedziału jest równa 20 to h1 = 345, h2 = 5 zatem zaakcentowane będą wszystkie punkty o wartościach większych lub równych 345 oraz punkty o wartościach mniejszych lub równych 5. Podobnie sytuacja wyglądać będzie, gdy haccent jest równe 5 i szerokość przedziału jest równa 20, wówczas h1 = 355, h2 = 15 zatem zaakcentowane będą wszystkie punkty o wartościach większych lub równych 355 oraz punkty o wartościach mniejszych lub równych 15.
Na przykładzie poniżej obraz oryginalny oraz obraz z zaakcentowanym kolorem czerwonym (szerokość przedziału 50).

Na przykładzie poniżej obraz oryginalny oraz obraz z zaakcentowanym kolorem zielonym (szerokość przedziału 50).

| Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
| Tomasz Lubiński | C/C++ | Borland Builder 6 | ![]() | ![]() |
![]() ![]() ![]() ![]() / 3 |
| Tomasz Lubiński | Delphi/Pascal | Borland Delphi 5 | ![]() | ![]() |
![]() ![]() ![]() ![]() / 4 |
Poprawiony: poniedziałek, 13 czerwca 2011 21:15




