Przetwarzanie obrazów cyfrowych

Zadanie do wykonania

Należy napisać program pozwalający na przetwarzanie obrazów cyfrowych. Program ma prezentować użytkownikowi menu, pozwalające na:

  1. wybór pliku zawierającego obraz przeznaczony do obróbki,
  2. wykonanie wybranych operacji na obrazie zgodnie z zaleceniem prowadzącego zajęcia (skalowanie, zamiana formatu obrazu, konturowanie, nakładanie obrazów itp.) -- opis możliwych operacji na obrazie znajduje się poniżej.
  3. zapisanie przetworzonego obrazu na pliku,
  4. wyświetlenie obrazu (początkowego lub po obróbce) na ekranie, w celu szybkiej weryfikacji wyniku,
  5. zakończenie działania programu.

Założenia do programu

W rozliczeniu ćwiczenia należy dostarczyć program napisany w pascalu.


Operacje na obrazie

Obrazy cyfrowe są na ogół dwuwymiarowymi tablicami złożonymi z pikseli, które to piksele reprezentowane są przez liczby określające ich jasność i kolor, a uzyskiwane na przykład z kamery podłączonej do komputera. Ważnym zagadnieniem w technice jest rozpoznawanie takich obrazów, to znaczy ustalenie, który fragment obrazu odpowiada któremu obiektowi rzeczywistemu, i jakie informacje o tym obiekcie możemy uzyskać, np. jego położenie, kierunek ruchu, prędkość. Jest to zadanie trudne, szczególnie ze względu na fakt, że obrazy otrzymywane z kamer zawierają oprócz obrazów interesujących obiektów dużą ilość innych informacji i są dodatkowo zmodyfikowane takimi zjawiskami jak: natężenie i kolor oświetlenia, ilość, rozmieszczenie i charakter źródeł światła, odbicia, nieostrość, różnice w obrazie obiektu w zależności od odległości i orientacji, oraz innymi. Dlatego, proces analizy obrazu rozbija się na szereg operacji prostszych, takich jak wstępna filtracja, skalowanie, konturowanie, wyodrębnienie obiektów itd.

Konturowanie

W niektórych zastosowaniach celowe jest sztuczne wyostrzanie konturów (obrysów poszczególnych elementów obrazów) w celu wydobycia szczegółów, prowadzące w krańcowym przypadku do przekształcenia obrazu do postaci dwupoziomowej, z zaznaczonymi wyłącznie konturami. Poniżej zajmiemy się konturowaniem obrazów monochromatycznych. Jedną z metod wyodrębniania konturów obrazu jest metoda gradientowa.

Gradient funkcji jest funkcją wektorową przyporządkowującą każdemu punktowi wektor wskazujący kierunek największego wzrostu funkcji podstawowej, o wartości proporcjonalnej do wielkości tego wzrostu. Jeżeli funkcją podstawową $ L(x,y)$ będzie funkcja jasności obrazu monochromatycznego (czarno-białego), to miejsca o dużych wartościach gradientu, czyli zmiany jasności, odpowiadają często konturom obiektów widocznych na obrazie.

Moduł gradientu funkcji jasności jest dany wzorem:

$\displaystyle \vert G(x, y)\vert =
\sqrt{\left(\frac{dL}{dx}\right)^{2}+\left(\frac{dL}{dy}\right)^{2}}
$

Dla zapisanego w dwuwymiarowej tablicy $ L[x,y]$ monochromatycznego obrazu cyfrowego możemy różniczki zupełne z powyższego wzoru zastąpić w przybliżeniu zwykłymi różnicami. Wzór przybiera wtedy postać:

$\displaystyle \vert G[x, y]\vert \approx \sqrt{(L[x+1,y]-L[x,y])^{2}+(L[x,y+1]-L[x,y])^{2}}
$

Z kolei, ponieważ przy konturowaniu istotny jest tylko bezwzględny przyrost wartości funkcji jasności, możemy skorzystać z wzoru uproszczonego, w którym pierwiastek sumy kwadratów zastąpiono sumą wartości bezwzględnych:

$\displaystyle \vert G[x,y]\vert \approx \vert L[x+1,y]-L[x,y]\vert+\vert L[x,y+1]-L[x,y]\vert
$

Oba powyższe wzory różnicowe można obliczyć dla wszystkich punktów obrazu, oczywiście za wyjątkiem punktów z ostatniego rzędu i ostatniej kolumny obrazu, co wynika to z przyjętego sposobu przybliżania różnic.

Skalowanie

Skalowanie polega na zmianie liczby pikseli tworzących obraz. Przy skali $ s$ z obrazu wyjściowego o wymiarach $ n\times m$ otrzymujemy obraz o wymiarach $ [s\ast n]\times [s\ast m]$, gdzie $ [x]$ oznacza część całkowitą liczby $ x$. Poniżej zostanie opisana metoda skalowania obrazów monochromatycznych dla skal całkowitych (powiększanie) i o wartościach $ 1/{}s$, $ s\in \mathcal Z$ (pomniejszanie). Dla jasności punktu obrazu wyjściowego danego funkcją $ L(x,y)$ obraz wynikowy będzie opisany przez

$\displaystyle \bar{L}(x,y)=L([(x-1)/{}s]+1,[(y-1)/{}s]+1),
$

$ 1\le x\le s\ast n$, $ 1\le y\le s\ast m$, przy powiększaniu (skala $ s$) oraz przez

$\displaystyle \bar{L}(x,y)=L(s\ast x,s \ast y),
$

$ 1\le x\le [n/{}s]$, $ 1\le y\le [m/{}s]$, przy pomniejszaniu (skala $ 1/{}s$). Widać, że przy takim wyborze funkcji skalowanie polega na powielaniu/pomijaniu punktów obrazu wyjściowego. Oczywiście możliwy jest inny wybór funkcji, przy których np. jasność punktów obrazu wynikowego wyliczana jest jako średnia jasności sąsiadujących ze sobą punktów obrazu wyjściowego.

Zamiana obrazu kolorowego na monochromatyczny

Zamiana obrazu kolorowego na monochromatyczny polega na wyliczeniu dla każdego piksela obrazu wyjściowego jego jasności na podstawie informacji o jego składowych kolorowych $ r(x,y)$, $ g(x,y)$, $ b(x,y)$. Najprościej można tego dokonać stosując wzór

$\displaystyle \bar{L}(x,y)=\frac{r(x,y)+g(x,y)+b(x,y)}{3},
$

$ 1\le x\le n$, $ 1\le y\le m$. Przy dokonywaniu procesu odwrotnego (zamianie obrazu monochromatycznego na kolorowy) najprościej jest przyjąć wartość jasności poszczególnych punktów jako wartości nasycenia ich składowych kolorowych (naturalnie nie zmieni to wyglądu obrazu -- zmianie ulegnie jedynie sposób jego reprezentacji).

Progowanie

Jedną z metod segmentacji obrazu jest progowanie. Polega ono na dokonaniu klasyfikacji pikseli obrazu do jednej z dwóch klas: zbioru punktów czarnych lub zbioru punktów białych. Proces może zostać przeprowadzony po arbitralnym wybraniu wartości progu $ p$ zgodnie ze wzorem

\begin{displaymath}
\bar{L}(x,y)=
\begin{cases}
0, & \text{dla }L(x,y)\le p,\\
1, & \text{dla }L(x,y)> p.
\end{cases}\end{displaymath}

Inne operacje na obrazie

Przedstawione operacje na obrazie nie wyczerpują oczywiście wachlarza możliwych sposobów przetwarzania obrazów. Ponadto możliwe jest łączenie kilku obrazów ze sobą, wycinanie fragmentów obrazu, obracanie obrazu, zmiana jego jasności, kontrastu, zabarwienia, solaryzacja, rozmywanie, wyostrzanie itp.


Reprezentacja obrazu

Obrazy pobierane z kamery, bądź dowolnego innego źródła, mogą być składowane na pliku dyskowym w jednym z wielu istniejących formatów zapisu obrazów rastrowych. Poniżej omówiono kilka z nich.

Formaty plików pbm

Przenośny format bitmapowy pbm (portable bitmap) jest to najprostszy format monochromatyczny (z pewnością dużo prostszy od jego opisu:-). Nadaje się on do przechowywania obrazów czarno-białych (sensu stricte, tzn. złożonych jedynie z pikseli czarnych lub białych). W podstawowej wersji tworzony plik jest plikiem tekstowym zawierającym informacje o pojedynczym obrazie. Plik zapisany w formacie pbm zawiera w kolejności:

Oto przykład małej bitmapy w tym formacie:

P1
# feep.pbm
24 7
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0
0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0
0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0
0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
która definiuje obraz o rozmiarach $ 24\times 7$ pikseli. Proszę zauważyć, że graficzny układ pliku nie musi odzwierciedlać w żaden sposób układu obrazka (wszystkie znaki mogą być podane w jednej linii, bądź każdy znak może znaleźć się w osobnej linii, czy jakkolwiek inaczej).

Istnieje wariant tego formatu pozwalający na zapisanie informacji o pikselach obrazu w postaci binarnej. Różnice pomiędzy tym formatem a formatem opisanym wcześniej to:

Więcej -- man pbm.


Formaty plików pgm

Przenośny format szarej bitmapy pgm (portable graymap) jest to prosty format monochromatyczny. Nadaje się on do przechowywania obrazów zawierających wiele odcieni szarości. W podstawowej wersji tworzony plik jest plikiem tekstowym zawierającym informacje o pojedynczym obrazie. Plik zapisany w formacie pgm zawiera w kolejności:

Oto przykład małej bitmapy w tym formacie:

P2
# feep.pgm
24 7
15
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0  3  3  3  3  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0 15  0
0  3  3  3  0  0  0  7  7  7  0  0  0 11 11 11  0  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0  0  0
0  3  0  0  0  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
która jak poprzednio definiuje obraz o rozmiarach $ 24\times 7$ pikseli, zawierający 15 odcieni szarości. I tutaj graficzny układ pliku nie musi odzwierciedlać w żaden sposób układu obrazka (wszystkie liczby mogą być podane w jednej linii, bądź każda liczba może znaleźć się w osobnej linii, czy jakkolwiek inaczej).

Istnieje także wariant tego formatu pozwalający na zapisanie informacji o pikselach obrazu w postaci binarnej. Różnice pomiędzy tym formatem a formatem opisanym wcześniej to:

Więcej -- man pgm.

Formaty plików ppm

Przenośny format pixmapowy ppm (portable pixmap) jest to prosty format dla obrazów kolorowych. Należy zaznaczyć, że format ten jest wysoce nie efektywny, powoduje tworzenie ogromnych plików, zawierających niejednokrotnie informacje o obrazie, których oko ludzkie w ogóle nie jest w stanie dostrzec. Jednakże prostota tego formatu decyduje o jego stosowaniu. W podstawowej wersji tworzony plik jest plikiem tekstowym zawierającym informacje o pojedynczym obrazie. Plik zapisany w formacie ppm zawiera w kolejności:

Oto przykład małej bitmapy w tym formacie:

P3
# feep.ppm
4 4
15
 0  0  0    0  0  0    0  0  0   15  0 15
 0  0  0    0 15  7    0  0  0    0  0  0
 0  0  0    0  0  0    0 15  7    0  0  0
15  0 15    0  0  0    0  0  0    0  0  0
która definiuje obraz o rozmiarach $ 4\times 4$ pikseli. Ponownie graficzny układ pliku nie musi odzwierciedlać w żaden sposób układu obrazka (wszystkie liczby mogą być podane w jednej linii, bądź każda liczba może znaleźć się w osobnej linii, czy jakkolwiek inaczej).

Istnieje także wariant tego formatu pozwalający na zapisanie informacji o pikselach obrazu w postaci binarnej. Różnice pomiędzy tym formatem a formatem opisanym wcześniej to:

Więcej -- man ppm.

Konwersja formatów

Częstokroć istnieje potrzeba zmiany formatu pliku, w którym zapisany został obraz. W najlepszym wypadku czynność ta wymaga odczytania zawartości konwertowanego pliku, przekształceniu formatu na docelowy i zapisaniu całości ponownie na plik. Tak będzie np. przy zamianie obrazu czarno-białego na obraz o 15-stu stopniach szarości, czy obrazu zawierającego 15 stopni szarości na obraz o 256-ciu stopniach szarości. Jednakże przy konwersji w drugą stronę (z 256-ciu stopni szarości na 15, czy z 15-stu na 2) wymagane jest wykonanie odpowiednich operacji na samym obrazie (ponieważ format docelowy pozwala na przechowanie mniejszej ilości informacji o obrazie niż format wyjściowy). Może dodatkowo pojawić się potrzeba progowania obrazu, zmniejszenia liczby zawartych w nim poziomów szarości, konwersji obrazu kolorowego do obrazu monochromatycznego.

Inne formaty plików graficznych

Oczywiście istnieje wiele innych formatów plików służących do przechowywania obrazów cyfrowych, jak chociażby popularne formaty jpeg (joint photographic experts group), gif (graphics interchange format), tiff (tag image file format) czy bmp (MS-Windows bitmap format).


Interfejs użytkownika

Każdy program przewidziany do interaktywnego wykorzystania przez użytkownika posiada interfejs użytkownika. Interferjs ten może przyjąć postać sekwencji zadawanych pytań, po których następuje realizacja zadania, prostego tekstowego menu, z którego użytkownik może wybrać pożądane operacje, czy w końcu zaawansowanego interfejsu graficznego, z całą paletą rozwijalnych menu, zakładek i tym podobnych elementów. Zazwyczaj najprostsze menu tekstowe programista tworzy nie wykorzystując żadnych dodatkowych narzędzi, zaś do budowy menu okienkowych czy graficznych wspomaga się odpowiednimi bibliotekami i innymi narzędziami. W systemie unix do budowy tekstowych menu okienkowych służy biblioteka curses. Ponadto interfejs użytkownika może stanowić integralną cześć programu lub może być samodzielnym programem. W drugim z wymienionych przypadków może go stanowić skrypt interpretowany przez jedną z dostępnych w uniksie powłok (powłokę Bourne shell, język skryptowy Tcl, pakiet okienkowy Tk).

About this document ...

This document was generated using the LaTeX2HTML translator Version 2K.1beta (1.48)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html -html_version 3.2,latin2,unicode -split 0 Obrazy_pgm

The translation was initiated by Robert Muszyński on 2003-04-02


Robert Muszyński 2003-04-02