background image

Z

Z

l

l

i

i

c

c

z

z

a

a

n

n

i

i

e

e

 

 

o

o

b

b

i

i

e

e

k

k

t

t

ó

ó

w

w

 

 

 

 

-

-

 

 

a

a

n

n

a

a

l

l

i

i

z

z

a

a

 

 

o

o

b

b

r

r

a

a

z

z

ó

ó

w

w

 

 

r

r

a

a

s

s

t

t

r

r

o

o

w

w

y

y

c

c

h

h

 

 

-

-

 

 

M

M

a

a

t

t

l

l

a

a

b

b

 

 

I

I

m

m

a

a

g

g

e

e

 

 

P

P

r

r

o

o

c

c

e

e

s

s

s

s

i

i

n

n

g

g

 

 

T

T

o

o

o

o

l

l

b

b

o

o

x

x

 

 

Pakiet 

MATLAB

  jest  środowiskiem  służącym  do  rozwiązywania  różnorodnych  problemów 

numerycznych.  Składa  się  on  z  pogrupowanych  tematycznie  w  katalogach  bibliotek  funkcji 
nazywanych  przybornikami  (toolboxes).  Funkcje  te  nazywane  są  m-plikami  (od  litery 
określającej  rozszerzenie  nazwy  pliku).  Napisane  są  one  w  języku  Matlaba,  będącym 
językiem wysokiego rzędu przystosowanym do operacji na macierzach. Tak też traktowane są 
wszystkie zmienne w Matlabie – jako tablice jedno-, dwu- lub wielowymiarowe. 

W środowisku Matlaba możliwe jest wykonywanie obliczeń na dwa sposoby. Pierwszy z nich 
polega na tym, że tworzymy własny m-plik, umieszczamy w nim właściwy kod programu, a 
na  koniec  uruchamiamy  go.  Drugi  sposób  polega  na  bezpośrednim  wykonywaniu  kolejnych 
instrukcji i wywoływaniu funkcji jedna po drugiej w środowisku interpretera języka Matlab. 
Matlab  jest  środowiskiem  w  którym  wykonywane  programy  nie  są  kompilowane,  lecz 
interpretowane.  Ma  to  oczywiścei  swoje  zalety  i  wady.  Do  zalet  należy  niewątpliwie  to,  że 
możemy  oglądać  kod  źródłowy  dowolnego  m-pliku  z  wybranego  przybornika,  do  wad  – 
powolne wykonywanie interpretowanych funkcji. 

Przybornikiem  zaprojektowanym  z  myślą  o  przetwarzaniu  i  analizie  obrazów  jest 

IMAGE 

PROCESSING TOOLBOX

. Zawiera on wiele funkcji umożliwiających m. in.: 

  czytanie, zapisywanie, wyświetlanie i konwersję plików graficznych 
  wykonywanie korekcji zdjęć 
  wykonywanie przekształceń geometrycznych 
  wykonywanie operacji na pojedynczych pikselach oraz blokach pikseli 
  stosowanie transformat obrazu 
  definiowanie filtrów liniowych i liniowe filtrowanie obrazu 
  maskowanie fragmentów obrazów 
  wykonywanie operacji morfologicznych na obrazach binarnych 
  analiza i rozpoznawanie obrazów 

background image

Podstawową strukturą danych w Matlabie jest tablica (macierz). Skrót Matlab oznacza Matrix 
Laboratory.  

W  przypadku  przetwarzania  obrazów  mapy  bitowe  przechowywane  są  w  tablicach 
dwuwymiarowych  lub  trójwymiarowych.  W  przestrzeni  roboczej  Matlaba  możliwe  jest 
przechowywanie czterech rodzajów map bitowych: 

 

obraz RGB

 (24-bitowa głęba kolorów) 

obraz jest przechowywany w trójwymiarowej tablicy o wymiarach n pikseli x m pikseli x 
3 składowe RGB  opisujące kolor pojedynczego piksela w skali: 

0 (brak składowej koloru) ... 1 (pełna składowa barwy) dla liczb rzeczywistych typu double 

lub 

0  (brak  składowej  koloru)  ...  255  (pełna  składowa  barwy)  dla  liczb  całkowitych 

jednobajtowych typu uint8 

 

 

obraz czarno-

biały o 256 odcieniach szarości

 (8-bitowa głęba odcieni szarości) 

obraz jest przechowywany w dwuwymiarowej tablicy o wymiarach n pikseli x m pikseli x 
1 składowa opisująca odcienie szarości w skali: 

0 (czarny) ... 1 (biały) dla liczb rzeczywistych typu double 

lub 

0 (czarny) ... 255 (biały) dla liczb całkowitych jednobajtowych typu uint8 

 

background image

 

obraz  indeksowany  z  paletą  kolorów

  (ilość  kolorów  określona  jest  przez  rozmiar 

tablicy zawierającej paletę używanych kolorów) 
obraz jest przechowywany w dwóch tablicach dwuwymiarowych. Pierwsza o wymiarach 
n  pikseli  x  m  pikseli  zawiera  numery  kolorów  (liczby  typu  double)  zdefiniowanych  w 
tablicy o wymiarach k kolorów x 3 składowe RGB typu double (k jest ilością barw jakie 
zawiera bitmapa). 

 

 

obraz binarny czarno-

biały 

(1-bitowa reprezentacja barwy czarny/biały) 

obraz jest przechowywany w tablicy  n x m pikseli, w której dany piksel przyjmuje tylko 
jedną  z  dwu  wartości  1  –  kolor  biały  lub  0  –  czarny.  Liczby  są  przechowywane  w 
formacie double lub uint8

 

Problem,  którym  zajmiemy  się  w  tym  ćwiczeniu,  polega  na  napisaniu  w  języku  Matlaba 
programu  zliczającego  obiekty  występujące  na  przykładowych  zdjęciach  substancji 
chemicznej.  Program  będzie  również  wyszukiwał  największy  obiekt  na  zdjęciu  i  podawał 
jego położenie względem lewego górnego rogu zdjęcia oraz wymiary w milimetrach. Zdjęcia, 
które będą poddawane analizie zawarte są w plikach: probka01.tif, probka02.tif, .... Proces 
rozpoznawania obiektów będzie wykonywany w kilku etapach. Na początku zdjęcie kolorowe 
zostanie  przekształcone  na  zdjęcie  w  odcieniach  szarości.  Następnie  zostanie  zwiększony 
kontrast  oraz  zostanie  usunięty  ewentualny  szum.  Potem zdjęcie  zostanie przekształcone  na 

background image

binarne  czarno-białe,  a  rozłączne  obszary  zostaną  oznaczone  i  ponumerowane.  Na  koniec 
określona zostanie ilość obiektów i wskazany zostanie największy. 

Przed rozpoczęciem ćwiczenia warto zapoznać się poniższymi przydatnymi uwagami. 

  dodatkowe  informacje  o  każdej  z  funkcji  Matlaba  można  uzyskać  pisząc 

help 

nazwa_funkcji 

lub uruchamiając opcję Help Desk i podając nazwę szukanej funkcji 

  w  każdej  chwili  można  zobaczyć  wartość  zmiennej  pisząc  jej  nazwę  lub  wywołując 

komendę 

disp(nazwa_zmiennej)

 

  aby  sprawdzić  jakie  zmienne  istnieją  w  przestrzeni  roboczej  Matlaba  należy  wywołać 

instrukcję 

who

 lub 

whos

 albo przełączyć się na zakładkę Workspace 

  wpisując kolejne liczby do tablicy, kolumny oddzielamy przecinkiem lub spacją, wiersze 

średnikiem lub enterem 

  komentarze umieszczamy w liniach zaczynających się od znaku % 

  funkcje zakończone średnikiem nie wyświetlają na ekranie zwracanych parametrów 
  aby w jednej linii umieścić więcej instrukcji oddzielamy je przecinkami lub średnikami 

Wczytanie  zdjęcia, wstępna obróbka mapy bitowej 

Ćwiczenie rozpoczynamy od wczytania do tablicy RGB jednej z map bitowych zawierających 
zdjęcia próbek i wyświetlenia jej. 

RGB=imread(’probka01.tif’); 
imshow(RGB) 

Następnie przekształcamy zdjęcie kolorowe na zdjęcie czarno-białe w odcieniach szarości 

GRAY=rgb2gray(RGB); 

lub podając “ręcznie” współczynniki wagowe dla konwersji trzech składowych kolorów. 

GRAY=uint8(0.299*double(RGB(:,:,1)) + 0.587*double(RGB(:,:,2)) +  

0.114*double(RGB(:,:,3))); 

Po  każdym  istotnym  przekształceniu  obrazu  jeżeli  chcemy  go  wyświetlić  wykonujemy 
instrukcję 

imshow(nazwa_tablicy)

 

lub  figure,  imshow(nazwa_tablicy)

  jeżeli 

chcemy, aby obraz był umieszczony w nowym oknie. 
Aby poszerzyć spektrum barw zdjęcia i tym samym zwiększyć kontrast, rozszerzamy zakres 
kolorów od najciemniejszego do najjaśniejszego w zdjęciu na zakres od koloru czarnego do 
koloru białego. Najpierw ustalamy najciemniejszy i najjaśniejszy odcień koloru szarego. 

l=min(min(GRAY));  h=max(max(GRAY)); 

a następnie poszerzamy rozkład poziomów zdjęcia 

GRAY_1=imadjust(GRAY,[double(l)/255, double(h)/255], [0,1]); 

Rozkład  tonalny  zdjęcia  przed  i  po  rozszerzeniu  zakresu  możemy  zobaczyć  na  wykresie 
nazywanym histogramem. 

figure, imhist(GRAY_1); 

background image

W  celu  wyeliminowania  szumu  występującego  na  zdjęciach  niektórych  próbek,  a  także 
lepszego  przystosowania  zdjęć  do  algorytmu  wykrywania  krawędzi,  możemy  zastosować 
jedną z funkcji zmiękczających i uśredniających. 

GRAY_2=uint8(filter2(F,GRAY_1,’valid’)); 
GRAY_2=uint8(medfilt2(GRAY_1,[3,3])); 
GRAY_2=uint8(wiener2(GRAY_1,[3,3])); 

Dla  pierwszego  filtru  tablicę  F  określającą  rodzaj  filtru  należy  wcześniej  wygenerować 
funkcją 

F=fspecial(’nazwa_filtru’,3); 

podając  nazwę  filtru 

’average’

  (filtr  uśredniający)  lub 

’gaussian’

  (filtr  rozmycia 

gaussowskiego).  Liczba  3  występująca  jako  parametr  we  wszystkich  filtrach  określa  stopień 
rozmywania. 

Poleca się także poeksperymentować z parametrami powyższych funkcji, oraz zobaczyć efekt 
działania innych filtrów możliwych do uzyskania funkcją 

fspecial

Konwersja zdjęcia na postać binarną, zliczanie obiektów 

Aby  policzyć  obiekty  widoczne  na  zdjęciu  musimy  przekształcić  je  do  postaci  binarnej 
czarno-białej.  Konwersję  możemy  wykonać  dwoma  metodami  i  aby  porównać  uzyskane 
wyniki i wybrać lepszą zastosujemy je obie. 
Pierwsza  metoda  polega  na  progowej  zamianie  koloru  piksela  na  biały  lub  czarny  w 
zależności  od  tego,  czy  kolor  danego  piksela  jest  jaśniejszy  czy  ciemniejszy  od  ustalonej 
wartości progowej. 

Po  dobraniu  odpowiedniej  wartości  z  przedziału  0...1  dla  zmiennej  progowej 

level

 

wywołujemy funkcję 

BW_1=~im2bw(GRAY_2,level); 

lub inaczej 

BW_1=~(GRAY_2>level*255); 

Symbol “

~

” oznacza negację. 

Wartość  zmiennej  progowej 

level

  optymalną  dla  wyodrębnienia  obiektów  z  tła  można 

wyznaczyć stosując funkcję 

graythresh

Druga metoda polega na znalezieniu brzegów (krawędzi) obiektów występujących na zdjęciu. 
Bazuje ona na funkcji 

edge

 wykrywającej krawędzie obiektów. 

Jako  drugi  argument  funkcji 

edge

  należy  podać  jedną  z  kilku  dostępnych  metod 

wyszukiwana  krawędzi  obszarów: 

’sobel’

’canny’

’prewitt’

’roberts’

’log’

 

oraz  opcjonalnie  ustawić  parametr 

thresh

  określający  czułość  danej  metody  przy 

wyznaczaniu krawędzi 

BW_1=edge(GRAY_2,’nazwa_metody’[,thresh]); 

 

background image

Na tym etapie ćwiczenia otrzymaliśmy binarną czarno-białą wersję analizowanego zdjęcia. 
W obrazie binarnym możemy usunąć szum pojedynczych pikseli wywołując funkcję 

BW_2=bwmorph(BW_1,’clean’); 

Poleca się sprawdzić inne rodzaje przekształceń dostępne w funkcji 

bwmorph

 

Do usuwania z  obrazu  małych, nieistotnych w  analizie  obiektów można  zastosować  funkcję 

bwareaopen

. Obiekty, które składają się z liczby pikseli mniejszej niż wartość, podana jako 

drugi argument przekazywany do funkcji, są usuwane.  

Następnym  etapem  wykonywanej  analizy  zdjęć  jest  ponumerowanie  rozłącznych  obszarów 
reprezentujących poszczególne obiekty na zdjęciu. Służy do tego funkcja 

bwlabel

 

[LAB, N]=bwlabel(BW_2,8); 

Wartość 8 oznacza zastosowanie przy wyszukiwaniu obiektów sąsiedztwa 8-punktowego dla 
każdego piksela. Drugą możliwością jest zastosowanie sąsiedztwa 4-punktowego. 

Różnicę  między  sąsiedztwem  8  i  4-punktowym  ilustruje  znajdujący  się  obok 
rysunek.  Stosując  sąsiedztwo  8  punktowe  funkcja 

bwlabel

  rozpozna  na  nim 

jeden obiekt, stosując sąsiedztwo 4-punktowe – dwa obiekty. 

Zwracane  przez  funkcję  zmienne  to 

LAB

  –  tablica  zawierająca  ponumerowane  obiekty,  

N

 – ilość obiektów w tablicy. 

Ponumerowane  obiekty  wyświetlimy,  każdy  w  innym  kolorze,  korzystając  z  funkcji 

jet 

generującej tablicę kolorów. 

map=[0 0 0;jet(N)]; 
figure,  imshow(LAB+1, map); 

Funkcja 

imshow

 wyświetla indeksowaną mapę  bitową pobierającą kolory z  tablicy kolorów 

map.

 

Ilość  obiektów  występujących  na  zdjęciu  przechowuje  teraz  zmienna 

N

.  Jej  wartość 

wyświetlić  można  instrukcją 

disp(N)

  lub 

sprintf(‘zdjęcie  zawiera  %d 

obiektów’,N)

 

Dla kilku różnych zdjęć należy porównać wartość N określającą ilość rozpoznanych obiektów 
z  rzeczywistą  policzoną  ilością  obiektów  występujących  na  tych  zdjęciach.  Porównać 
wartości otrzymane z zastosowaniem funkcji 

im2bw

 i 

edge

Znalezienie największego obiektu, określenie jego położenia i wymiarów 

Ostatnim  etapem  wykonywanej  analizy  obrazu  jest  znalezienie  największego  obiektu. 
W przypadku  zastosowania  funkcji 

im2bw

  będzie  to  kryterium  największej  powierzchni,  w 

przypadku funkcji 

edge

 – kryterium największego obwodu. 

Przy  szukaniu  największego  obiektu  zastosujemy  instrukcję  pętli,  która  w  Matlabie  ma 
następującą składnię: 

for i=wart_pocz:wart_końc, 
  ... 
end 

background image

Skorzystamy  także  z  instrukcji 

find

  wyszukującej  wszystkie  elementy  tablicy  spełniające 

podany warunek. Funkcja ta zwraca tablicę zawierającą współrzędne tych punktów. 

Poniżej  znajduje  się  fragment  programu  odpowiedzialny  za  wyszukanie  największego 
obiektu. 

[y,x]=find(LAB==1); 

% znajdź wszystkie piksele składające się na pierwszy obiekt 

max_pix=length(x); 

% pierwszy obiekt składa się z max_pix pikseli 

max_nr=1; 

% największy jest obiekt 1 

for i=2:N, 

% przeszukaj obiekty od 2 do N 

  [y,x]=find(LAB==i); 

% znajdź wszystkie piksele składające się na i-ty obiekt 

  if length(x)>max_pix 

% sprawdź, czy nie znalazłeś nowego największego obiektu 

    max_pix=length(x); 

% jeżeli tak, to zapamiętaj z ilu pikseli się składa 

    max_nr=i; 

% i jaki ma numer 

  end 
end 

Największy obiekt wybieramy funkcją 

bwselect

, a następnie wyświetlamy funkcją 

imshow

[y,x]=find(LAB==max_nr); 

% znajdź piksele składające się na największy obiekt 

BW_MAX=bwselect(LAB,x(1),y(1),8); 

% zaznacz tylko ten obiekt 

figure,  imshow(BW_MAX), title(’największy obiekt’); 

% wyświetl go 

Położenie  i  rozmiar  tego  obiektu  (podane  w  milimetrach)  obliczamy,  a  następnie 
wyświetlamy wykonując podane poniżej instrukcje 

DPI=72; 

% rozdzielczość zdjęć 

inch=25.4; 
x_sr=0.5*(min(x)+max(x))*inch/DPI; 

% położenie największego obiektu 

y_sr=0.5*(min(y)+max(y))*inch/DPI; 
szer=(max(x)-min(x))*inch/DPI; 

% wymiary największego obiektu 

wys =(max(y)-min(y))*inch/DPI; 
sprintf(’największy obiekt: x=%.1f, y=%.1f, dx=%.1f, dy=%.1f’, 
         x_sr, y_sr, szer, wys) 

Dla  kilku  różnych  zdjęć  należy  porównać  czy  największy  występujący  na  nich  obiekt 
rzeczywiście  pokrywa  się  z  największym  obiektem  wyznaczonym  przez  opracowany 
algorytm.  Porównać  algorytm  wykorzystujący  funkcję 

im2bw

 

algorytmem 

wykorzystującym funkcję 

edge

 

background image

Analizowane bitmapy 

 

 

 

probka01 

probka02 

probka03 

 

 

 

probka04 

probka05 

probka06 

 

 

 

probka07 

probka08 

probka09 

 

 

 

probka10 

probka11 

probka12 

 

 

probka13 

probka14