czwartek, 5 czerwca 2008

Widzenie barwne i Unix

Widzenie barwne człowieka oparte jest na trzech różnych typach komórek światłoczułych, czułych odpowiednio na światło czerwone, zielone i niebieskie, dlatego każde wrażenie barwne może być wywołane za pomocą bodźców trójkolorowych wymieszanych w odpowiednich proporcjach. Kolor żółty widzimy, gdy pobudzimy oko mieszaniną barwy zielonej i czerwonej, ale identyczny kolor spostrzegamy gdy pobudzimy oko monochromatycznym światłem żółtym. Nie ma tu analogii do słyszenia dźwięków: człowiek odróżnia wielodźwięki od dźwięków prostych, ponadto nie jest wrażliwy na wysokość dźwięku, a raczej na ich różnicę.

Znalazłem gdzieś w sieci obrazek mający przedstawiać widmo światła białego:


Postanowiłem zbadać, jak został skonstruowany z trzech barw
składowych. Tęcza powinna składać się z barw prostych o zmieniającej się płynnie długości. Grafika komputerowa to - wiadomo - mieszanina trzech barw prostych o różnym natężeniu w różnych punktach - coś całkiem innego niż oryginalny pierwowzór. Gdyby istniała istota zdolna do widzenia absolutnego barw, bez trudu rozpoznałaby oszustwo. Ja potrzebowałem do tego kilku narzędzi uniksowych.

Po pierwsze rozkompresowałem obrazek przy użyciu djpeg:

$ djpeg pasek.jpg > pasek.ppm

Następnie przekonwertowałem plik na format tekstowego ppm'a, aby łatwiej mi było go dalej przetwarzać:

$ pnmnoraw pasek.ppm > pasek.txt
Szybki rzut oka do pliku:

$ head pasek.txt
P3
600 66
255
254 0 0
254 0 0
254 0 0  
254 0 0  
253 1 0  
....

Mamy 600 pikseli szerokości.

Teraz zamieniam trochę porządek, żeby mieć jeden piksel w jednym wierszu:

$ awk '{
>         S="";
>         for (i=1; i<=NF; i++) {
>                 S=S" "$i;
>                 if (i % 3 == 0) {
>                         print S;
>                         S="";
>                 }
>         }
> }' pasek.txt > pasek.x

$ head pasek.x
254 0 0
254 0 0
254 0 0
254 0 0
....
Dobrze idzie, teraz wezmę jeden rządek i narysuję wykres nasycenia trzech barw:
 
$ head -n 600 pasek.x > pasek3
$ gnuplot
gnuplot> plot 'pasek3' using 1 with lines, 'pasek3' using 2 with
lines, 'pasek3' using 3 with lines
Pięknie, widać, co zrobił autor tego rysunku: wygenerował go automatycznie używając kawałków liniowych funkcji !

Jeszcze tylko wykonałem zrzut ekranu i zamieniłem go na jpg, żeby umieścić wykres w blogu:

 
$ xwd
$ xwdtopnm pasek.xwd > pasek3.ppm
xwdtopnm: writing PPM file
$ cjpeg pasek3.ppm > wykres1.jpg
Gotowe.
Ciekawe, jakbym to zrobił w Windowsach ...

Ciekawostką jest fakt, że gnuplot do oznaczania kolejnych linii używa kolorów właśnie w kolejności
czerwony, zielony, niebieski.
Inną ciekawostką jest czerwony składnik po prawej stronie widma -
tam, gdzie mamy mocny fiolet.

Brak komentarzy: