Wpisany przez Tomasz Lubiński,
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
Z tego też powodu przy obliczaniu zakresu akcentu możemy natrafić na dwa przypadki:
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
h_1 = \left(h_{accent} - \frac{range}{2} + 360\right)\mod 360
do
h_2 = \left(h_{accent} + \frac{range}{2} + 360\right)\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).
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | C# | Microsoft Visual C# 2010 | .cs | .cs | ***** / 0 |
Tomasz Lubiński | C/C++ | Borland Builder 6 | .cpp | .cpp | ***** / 5 |
Tomasz Lubiński | Delphi/Pascal | Borland Delphi 5 | .pas | .pas | ***** / 4 |
Poprawiony: 19 sierpnia 2012 10:03
Komentarze
-3
#
Grabarz
2013-11-21 13:44
Znowu implementacja a Pascalu. Pascal, Pascal... wszędzie Pascal, a już praktycznie się tego nie używa.
Odpowiedz | Odpowiedz z cytatem | Cytować
+2
#
Malarz
2018-02-26 13:26
Pascala jako takiego się nie używa, ale ta implementacja zadziała także w Free Pascalu, Lazarusie i Delphi. A tych 3 się używa nadal.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz