• Nie Znaleziono Wyników

Przetwarzanie wyodrębnionych na obrazie obiektów możliwe jest po przeprowadzeniu operacji indeksacji (ang. labelling ), polegającej na przypisaniu każdego piksela obrazu do jednego z znalezionych obiektów. Daną wejściową indeksacji obrazu jest obraz binar-ny, oznaczany symbolemJB(x, y), otrzymany w wyniku wykonania progowania obrazu na obrazieJ(x, y) (otrzymanym z kamery) oraz serii dodatkowych operacji przygotowu-jących obraz do indeksacji, takich jak filtracja zakłóceń za pomocą filtru medianowego oraz morfologiczna operacja otwarcia. Na obrazieJB(x, y) kolor biały jest kolorem tła.

Wynikiem przeprowadzenia operacji indeksacji jest obraz o rozdzielczości obrazu orygi-nalnego, w którym jasność poszczególnych pikseli oznacza przynależność danego punktu obrazu do znalezionego na obrazie obiektu. Obraz ten jest dalej oznaczany symbolem JI(x, y). Zerowa wartość danego piksela obrazuJI(x, y) (kolor czarny) oznacza, że dany punkt obrazu należy do tła (nie został przydzielony do żadnego obiektu). Wartość więk-sza od zera oznacza przypisanie danego punktu obrazu do konkretnego obiektu, przy czym poziom jasności piksela oznacza indeks w tablicy znalezionych obiektów. Ponie-waż liczba znalezionych obiektów może zacznie przekroczyć liczbę 255, wartości pikseli obrazu wynikowego indeksacji zapisywane są za pomocą liczb typu INT (32 bity).

Indeksacja ułatwia wyznaczenie parametrów obiektów, takich jak: powierzchnia, dłu-gość obwodu, długości przekątnych, moment pierwszego (środek ciężkości) i wyższych rzędów, współczynniki kształtu (np. zwartość lub niecentryczność). Proces indeksacji może być wykonywany na kilka sposobów. Często realizuje się go na podstawie wy-znaczonego konturu obiektu [59]. Najpopularniejsza technika polega na przeglądaniu zbinaryzowanego obrazu linia po linii. Opracowanie i implementacja algorytmu indek-sacji obrazu zostały przeprowadzone samodzielnie. Okazało się później, że otrzymany rezultat jest podobny do rozwiązania przedstawionego w książce Tadusiewicza, Kompu-terowa analiza i przetwarzanie obrazów [74] oraz w artykule [31].

Działanie algorytmu indeksacji obrazu prześledźmy na przykładowym obrazie binar-nym przedstawiobinar-nym na rysunku 5.15a. Białym prostokątom odpowiadają białe piksele obrazu, szare pola reprezentują czarne piksele obrazu binarnegoJB(x, y). Liczby w pro-stokątach oznaczają zawartość obrazu wynikowegoJI(x, y), przechowującego informację o przynależności poszczególnych pikseli obrazu binarnego JB(x, y) do poszczególnych obiektów. Na początku obrazJI(x, y) zawiera same wartości zerowe, oznaczające

przy-a) b)

Rysunek 5.15: Ilustracja działania indeksacji obrazu. Szare tło oznacza kolor czarny na obrazie binarnym JB(x, y). Liczby oznaczają jasność pikseli obrazu JI(x, y). a) Obraz przed indeksacją obrazu; b) obraz po wykonaniu pierwszego etapu indeksacji obrazu;

należność pikseli do tła. Proces indeksacji składa się z trzech etapów:

1. Wstępne indeksowanie obrazu.

2. Porządkowanie tablicy sklejeń.

3. Przeindeksowanie obrazu wyjściowegoJI(x, y).

Podczas wstępnej indeksacji obrazu wykorzystywana jest zmienna loboznaczająca liczbę znalezionych obiektów. Początkowa wartość zmiennej lob wynosi 0. Wstępne etykieto-wanie obrazu przebiega następująco:

1. Przeglądamy obraz binarny JB(x, y) linia po linii. Współrzędne aktualnie testo-wanego piksela obrazu mają współrzędne x, y.

2. JeżeliJB(x, y) = 0 (czarny piksel obrazu), sprawdzamy czy jest to kolejny czarny piksel w danym wierszu. JeśliJB(x−1, y) = 0, jest to kolejny czarny piksel obrazu i przechodzimy do punktu 4. W przeciwnym wypadku mamy do czynienia z nowym czarnym pikselem w analizowanym wierszu i przechodzimy do punktu 3.

3. Jeżeli powyżej analizowanego piksela obrazu znajduje się biały piksel obrazu, JB(x, y− 1) ̸= 0 ⇒ JI(x, y − 1) = 0, mamy do czynienia z pikselem należą-cym do nowego obiektu. W takim przypadku zwiększamy liczbę znalezionych obiektów, lob = lob + 1, oraz aktualnemu pikselowi obrazu wynikowego przy-pisujemy przynależność do nowego obiektu, JI(x, y) = lob. W przeciwnym wy-padku, gdy JB(x, y − 1) = 0 ⇒ JI(x, y − 1) ̸= 0, aktualnemu pikselowi ob-razu wynikowego przypisujemy przynależność do wcześniej utworzonego obiektu JI(x, y) =JI(x, y− 1). Przechodzimy do kolejnego punktu obrazu (punkt 1).

4. Jeżeli powyżej analizowanego piksela obrazu znajduje się biały piksel obrazu, JB(x, y − 1) ̸= 0 ⇒ JI(x, y − 1) = 0, aktualnemu pikselowi obrazu wyniko-wego przypisujemy przynależność do wcześniej utworzonego obiektu JI(x, y) = JI(x−1, y). W przeciwnym wypadku, gdy JB(x, y−1) = 0 ⇒ JI(x, y−1) ̸= 0, wy-bieramy obiekt o mniejszym numerze, JI(x, y) = min (JI(x− 1, y), JI(x, y− 1)).

Przechodzimy do kolejnego punktu obrazu (punkt 1).

Na rysunku 5.15b przedstawiono wynik wstępnej indeksacji obrazu. Na opisanym przy-kładzie widzimy, że przedstawiony mechanizm może prowadzić podczas etykietowania do powstania w obrębie jednego obiektu kilku obszarów o różnych etykietach. W celu uniknięcia powstałych błędów, wprowadzono tablicę sklejeńTI(i), zawierającą informa-cje o powiązaniach pomiędzy obiektami i pozwalającą, na dalszym etapie przetwarzania, na scalenie sąsiadujących ze sobą obiektów.

a)

b)

c)

Rysunek 5.16: Tabela sklejeń. Szare tło oznacza indeksy, które zostaną usunięte. a) Po-czątkowa zawartość tabeli sklejeń; b) Zawartość tabeli sklejeń po pierwszym etapie indeksacji obrazu; c) Zawartość tabeli sklejeń przed trzecim etapem indeksacji obrazu;

Początkowa zawartość tablicy sklejeń TI(i) przedstawiona jest na rysunku 5.16a.

Indeks i w tablicy (numeracja pól nad tablicą) oznacza numer obiektu. Zawartość pól tablicy przechowuje informację z jakim obiektem (indeks obiektu) powinien być połączo-ny obiekt o indeksie wskazującym na dapołączo-ny element tablicy. Wartość 0 oznacza, że dapołączo-ny obiekt jest obiektem pierwotnym. Ponieważ wartość 0 w obrazie wynikowym JI(x, y) oznacza powierzchnię tła, elementy tablicy indeksowane są od numeru 1. Aby scalanie przylegających do siebie obiektów o różnych indeksach było możliwe, tablica sklejeń musi być wypełniona odpowiednimi wartościami podczas pierwszego etapu indeksacji obrazu. W tym celu, w punkcie 4 opisanego powyżej algorytmu, gdy JI(x− 1, y) ̸= 0 i JI(x, y− 1) ̸= 0, następuje aktualizacja tablicy sklejeń.

Załóżmy najprostsze podejście, polegające na tym, że obiektowi o wyższym indeksie przypisujemy obiekt o niższym indeksie. Niech imin = min (JI(x− 1, y), JI(x, y− 1)) a imax = max (JI(x− 1, y), JI(x, y− 1)), wtedy TI(imax) = imin. W takim przypadku jednak, analizując przedostatni wiersz obrazu binarnegoJB(x, y), obiektowi o indeksie 14 przypisalibyśmy obiekt o indeksie 8 (TI(14) = 8). Podczas analizy ostatniego wiersza obrazu, musielibyśmy obiektowi o indeksie 14 przypisać obiekt o indeksie 10 (TI(14) = 10). W tym momencie utracilibyśmy informacje o powiązaniu pomiędzy obiektami o indeksach 8 i 14.

Załóżmy kolejne podejście, w którym TI(JI(x− 1, y)) = JI(x, y− 1). Przy takim podejściu, w przykładzie przedstawionym na rysunku 5.15 nie utracilibyśmy informacji o wzajemnych powiązaniach między obiektami, niemniej przykład przedstawiony na ry-sunku 5.17 pokazuje, że rozwiązanie takie nie daje gwarancji niezawodnego scalenia ze sobą połączonych obiektów. W przykładzie tym, obiektowi o indeksie 1 wpierw przypi-sano obiekt o indeksie 2 a następnie obiekt o indeksie 3, tracąc tym samym informację o powiązaniach pomiędzy obiektami o indeksach 1 i 2.

Gwarancję prawidłowego przypisania obiektów w tablicy sklejeń daje przypisanie no-wego obiektu za każdym razem do obiektu pierwotnego, takiego, który w tablicy sklejeń nie ma przypisanego innego obiektu, tj. TI(i) = 0. Załóżmy, że mamy następujące po-wiązania między obiektami: 57→ 4, 4 7→ 3, 7 7→ 2, 2 7→ 1. Poszczególne liczby oznaczają indeksy w tablicy sklejeń, strzałka natomiast wskazuje miejsce wpisania powiązania, np.

57→ 4 oznacza zapis TI(5) = 4. Zestawienie tych połączeń pozwala zapisać: 57→ 4 7→ 3 oraz 7 7→ 2 7→ 1. Wynika z tego, że prawidłowy jest również zapis 5 7→ 3 oraz 7 7→ 1.

W momencie łączenia ze sobą obiektów o indeksach 6 (6 7→ 0) i 5 możemy zapisać,

Rysunek 5.17: Przykład do niewłaściwego wypełnienia tablicy sklejeń.

6 7→ 3, tzn. TI(6) = 3 lub 6 7→ 5, ponieważ obiekt o indeksie 6 nie jest jeszcze po-wiązany z żadnym innym obiektem. Gdy łączymy ze sobą obiekty o indeksach 6 i 7, zapis 7 7→ 6 spowoduje utratę połączenia 7 7→ 2, natomiast powiązanie 6 7→ 1 będzie jak najbardziej prawidłowe. Połączenie obiektów o indeksach 5 i 7 wymaga utworzenia powiązania 3 7→ 1 (TI(3) = 1), gdyż w takim przypadku obiekt o indeksie 5 jak rów-nież obiekt o indeksie 7 będą powiązane z tym samym obiektem o indeksie 1 (5 7→ 1 oraz 77→ 1). Podczas połączenia obiektów nie nastąpi utrata informacji o jakimkolwiek powiązaniu obiektów ze sobą, gdyż obiekt o indeksie 3 jest obiektem pierwotnym.

Z powyższych przykładów można wydedukować przepis na właściwe łączenie infor-macji o powiązaniu obiektów między sobą. Wróćmy do punktu 4 opisanego powyżej algorytmu wstępnego indeksowania obrazu, gdyJI(x− 1, y) ̸= 0 i JI(x, y− 1) ̸= 0. Zde-finiujmy funkcjęII(i) zwracającą indeks obiektu pierwotnego, powiązanego z obiektem o indeksie i, podanym jako parametr funkcji. Jeżeli TI(i) = 0, funkcja II(i) zwraca wartość i. Jeżeli prawdziwy jest zapis 7 7→ 2 7→ 1, funkcja II(7) = 1. Gdy prawdzi-wy jest zapis 6 7→ 0 to II(6) = 6. Ostateczna procedura aktualizacji tablicy sklejeń podczas pierwszego etapu indeksacji obrazu jest następująca: ix = II(JI(x− 1, y)), iy =II(JI(x, y− 1)), imin= min (ix, iy), imax= max (ix, iy), wtedyTI(imax) = imin.

Na rysunku 5.16b przedstawiono przykładową zawartość tablicy sklejeń dla przykła-du przedstawionego na rysunku 5.15. Strzałkami zaznaczono, które obiekty są ze sobą skojarzone, oraz za pomocą szarego pola, zaznaczone są te indeksy, które na dalszym etapie przetwarzania zostaną usunięte.

Drugim etapem indeksacji obrazu jest porządkowanie tablicy sklejeń TI(i), w celu przygotowania jej do końcowego przeindeksowania obrazu wynikowegoJI(x, y). W tym celu realizowane są następujące operacje:

1. Prewencyjnie każdemu niezerowemu polu tablicy sklejeń przyporządkowujemy in-deks obiektu pierwotnego:

TI(i)̸=0

TI(i) =II(i). (5.25)

2. Zliczamy liczbę obiektów pierwotnych dokonując jednocześnie przeindeksowania tablicy sklejeń. Przyjmijmy pomocniczą zmienną lpierw oznaczającą liczbę obiek-tów pierwotnych. Początkowa wartość zmiennej lpierw wynosi 0. Przeglądamy wszystkie elementy tablicyTI(i) dla i ={1, . . . , lob}. Dla każdego obiektu pierwot-negoTI(i) = 0 zwiększamy tymczasową liczbę obiektów o jeden, lpierw = lpierw+ 1 oraz aktualizujemy wartość tablicyTI(i) = lpierw. W przeciwnym wypadku tabli-ca sklejeń przyjmuje wartość TI(i) = TI(TI(i)). Na koniec aktualizujemy liczbę znalezionych obiektów lob= lpierw.

Efekt wykonania drugiego etapu indeksacji obrazu dla naszego przykładu można zoba-czyć na rysunku 5.16c. Tak przygotowaną tablicę można bezpośrednio wykorzystać w trzecim i ostatnim etapie indeksacji obrazu, polegającym na przeindeksowaniu obrazu wyjściowegoJI(x, y).

Operacja przeindeksowania obrazu JI(x, y) polega na przejrzeniu obrazu linia po linii i przypisaniu każdemu pikselowi obrazu nowej wartości odczytanej bezpośrednio z tablicy sklejeńTI(i). Dla każdego punktu obrazu wykonywana jest operacja:

x,y

JI(x, y) =TI(JI(x, y)). (5.26)

a) b)

Rysunek 5.18: Przedstawienie działania indeksacji obrazu. Szare tło oznacza kolor czar-ny na obrazie binarczar-nym. a) Obraz wynikowy po wykonaniu pierwszego etapu indeksacji obrazu; b) obraz wynikowy po wykonaniu trzeciego etapu indeksacji obrazu;

Rysunek 5.18 przedstawia końcowy wynik indeksacji obrazu przeprowadzonej dla przykładu z rysunku 5.15a. Efekt indeksacji obrazu przeprowadzonej na oryginalnym obrazie otrzymanym z kamery można zobaczyć na rysunku 5.13, na którym poszczegól-nym obiektom przypisano inny poziom jasności. Na widoczposzczegól-nym obrazie kolejne otwory mają przypisaną coraz jaśniejszą barwę. Tak przygotowany obraz jest wykorzystywany podczas wyznaczania parametrów znalezionych obiektów.

W przeciwieństwie do algorytmu indeksacji obrazu opisanego w książce [74], algo-rytm opisany w tym rozdziale powoduje rozdzielenie obiektów, których skrajne piksele łączy jedynie narożnik (np. obiekty 1 i 4 oraz 6 i 8 na rysunku 5.18b).