algorytm.org

Akcent kolorystyczny



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Akcent kolorystyczny
Ocena użytkowników:***** / 23
SłabyŚwietny 
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
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:

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).

akcent kolorystyczny - czerwony

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

akcent kolorystyczny - zielony


Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiC#Microsoft Visual C# 2010
.cs
.cs
***** / 0
Tomasz LubińskiC/C++Borland Builder 6
.cpp
.cpp
***** / 5
Tomasz LubińskiDelphi/PascalBorland Delphi 5
.pas
.pas
***** / 4
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 19 sierpnia 2012 10:03
Komentarze
photo
-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ć
photo
+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