Proste przetwarzanie obrazów

23.12.2009 - Rafał Kozik
TrudnośćTrudność

Jednym z popularnych zastosowań współczesnych komputerów jest przetwarzanie obrazów. Zdjęcia z aparatów fotograficznych nie zawsze wychodzą takie jak oczekujemy -- czasami są za ciemne, czasami zbyt jasne. Możemy to łatwo poprawić w programach takich jak Paint.NET, GIMP czy choćby Photoshop. Okazuje się, że nie ma w tym żadnej magii, o czym postaram się trochę poopowiadać.

Zacznijmy od tego czym tak naprawdę jest obraz. Typowy obrazek zbudowany jest z pikseli -- bardzo małych kwadracików o ustalonym kolorze. Dla przykładu, typowy laptop o matrycy 15.4" ma w dzisiejszych czasach rozdzielczość 1280x800 pikseli (czyli w sumie ma ich 1 024 000). Dla ludzkiego oka piksele na obecnych wyświetlaczach są tak małe, że obraz z nich zbudowany wygląda spójnie (stanowi harmonijną całość) . Ale przyjrzyjmy się zdjęciu z bliska:

pixels

Obraz testowy pochodzi z serwisu http://sxc.hu.

1. Trochę o pikselach

Komputer jest w stanie przechowywać i przetwarzać liczby, a nie kolory. Skąd mamy zatem wiedzieć jaki jest kolor piksela? Istnieje kilka sposobów reprezentacji pikseli w pamięci komputera, a najpopularniejszy z nich to RGB.

Na fizyce uczono nas, że w wyniku połączenia światła niebieskiego, zielonego i czerwonego uzyskamy światło białe:

lights

Jeżeli wszystkie światła świecą z taką samą, ale mniejszą mocą, to uzyskamy kolor szary. Zmieniając intensywność poszczególnych świateł moglibyśmy uzyskać dowolne kolory. Ten sam pomysł został użyty do przedstawiania koloru w formacie RGB. Każdy piksel zapisany jest jako trójka liczb z zakresu od 0 do 255, które oznaczają jak mocno będzie świecić światło czerwone (Red), zielone (Green) i niebieskie (Blue) -- stąd nazwa RGB. Tylko dlaczego akurat taki zakres?

Pierwszym powodem jest oszczędność pamięci -- dzięki takiej reprezentacji każdy piksel będzie zajmował tylko trzy bajty w pamięci (1 bajt na każdy kolor). Jednak nawet przy takim rozwiązaniu okazuje się, że obrazek o rozdzielczości 1024x1024 piksele ma rozmiar aż 3 MB. W przeszłości, kiedy pamięć była droga i każdy megabajt był na wagę złota, miało to niebagatelne znaczenie. Wbrew pozorom, w dzisiejszych czasach na tym znaczeniu nie straciło. Choć obecne komputery posiadają znacznie więcej pamięci, a jej ceny bardzo spadły, to pojawił się inny aspekt -- przesyłanie obrazów przez Internet. Dlatego rozmiar obrazów nadal się minimalizuje, żeby czasy przesyłania były jak najmniejsze (stosując dodatkowo zaawansowane metody kompresji).

Drugi powód jest znacznie prostszy -- w taki sposób możemy zapisać ponad 16 milionów różnych kolorów, co zupełnie wystarcza dla większości zastosowań. Sytuacją, w której mogą pojawić się problemy są płynne przejścia między kolorami (gradienty). Przykładowo poniższy obrazek ma 600 pikseli szerokości, po lewej stronie jest kolor czarny ([0; 0; 0]), a po prawej kolor ciemno szary ([99; 99; 99]). Aby uzyskać płynne przejście, musimy wybierać od lewej strony coraz jaśniejsze kolory -- niestety między tymi kolorami jest tylko 100 różnych odcieni szarości (odcienie szarości mają identyczne składowe RGB, zatem są to [0; 0; 0], [1; 1; 1], itd.). Przez to poniższy obraz zbudowany jest z prostokątów o szerokości 6, wypełnionych kolejnymi kolorami. Można zobaczyć jako 'pionowe paski', gdy się uważnie przyjrzymy.

gradient

Nie jest to jednak wielki problem, ponieważ w rzeczywistości takie sytuacje występują rzadko, a na dodatek istnieją sposoby na to, żeby sobie z tym radzić.

Z gradientami związane jest też ciekawe złudzenie optyczne, zwane kontrastem równoczesnym. Polega ono na wpływie pola otaczającego na postrzeganie obiektu, np. jego jasności. Stąd na poniższym obrazku wydaje się, wewnętrzny pasek również jest gradientem, gdy w rzeczywistości jest wypełniony jednym kolorem.

gradient złudzenie

Poniższy aplet pozwala na lepsze zobrazowanie reprezentacji RGB:

Your browser is not Java enabled.
Zgłoś problem z apletem

Model przestrzeni barw jaki tu widzimy jest modelem addytywnym -- sumujemy moc poszczególnych świateł, żeby uzyskać obraz na czarnym tle. Reprezentacja RGB nadaje się idealnie do wyświetlania obrazu na monitorach, które działają właśnie na tej zasadzie. Niestety reprezentacja ta nie nadaje się do druku.

Z plastyki powinniśmy pamiętać, że mieszanie podstawowych kolorów nie da nam koloru białego, a wręcz przeciwnie. Mamy tu styczność z modelem subtraktywnym -- nasz wydruk ogranicza spektrum odbijanego światła, dzięki czemu uzyskujemy kolor. Do tego celu przydaje się reprezentacja CMYK, gdzie przechowujemy kolory jako natężenia cyjanu (Cyan), magnety (Magneta), żółtego (Yellow) i czarnego (Key black). Kolor czarny pojawił się na potrzeby przemysłu poligraficznego, aby zmniejszyć ilość zużywanych farb kolorowych.

lights

Inną popularną metodą reprezentacji kolorów jest HSV -- kolory są w niej przedstawiane jako trójka wartości: barwa (Hue), nasycenie (Saturation) i wartość (Value), która oznacza jasność (intensywność światła białego). Barwa jest rozumiana jako kąt z zakresu od 0 do 360 stopni, a nasycenie i wartość są liczbami rzeczywistymi z zakresu od 0 do 1. Interpretację graficzną tej reprezentacji można zobaczyć na tym obrazie pochodzącym z wikipedii:

hsv

Reprezentacja ta lepiej odzwierciedla sposób działania ludzkiego oka i w naturalny sposób można dzięki niej osiągnąć część efektów tj. rozjaśnianie czy pociemnianie (zmiana jasności), a nawet przekształcenie obrazu na odcienie szarości (zmiana nasycenia na 0). Istnieją wzory, które pozwalają na zmianę kolorów z reprezentacji RGB na HSV i na odwrót.

4.333335
Twoja ocena: Brak Ocena: 4.3 (3 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com