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
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
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
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);
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]);
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
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
z
algorytmem
wykorzystującym funkcję
edge
.
Analizowane bitmapy
probka01
probka02
probka03
probka04
probka05
probka06
probka07
probka08
probka09
probka10
probka11
probka12
probka13
probka14