Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

Poglavlje 10

Laboratorijske vježbe:
Segmentacija slike -
nastavak

10.1 Metode segmentacije zasnovane na regionima


Region growing predstavlja pristup segmentaciji kod kojeg se pikseli grupišu
u veće regione na osnovu njihove medusobne sličnosti, a koji je definisana ne-
kim kriterijom sličnosti. Segmentacija započinje sa odredenim brojem slučajno
odabranih piksela slike (tzv. seed) i dodavanjem piksela iz njihovog susjedstva
regionima kojim ti pikseli pripadaju ako susjedni pikseli zadovoljavaju odredene
kriterije. Ti kriteriji mogu biti povezani sa intenzitetom piksela, bojom ili nekim
statističkim osobinama. Neki jednostavni kriteriji mogu biti:
• Apsolutna razlika intenziteta izmedu piksela kadidata i seed piksela mora
biti unutar definisanog raspona vrijednosti.
• Apsolutna razlika intenziteta izmedu piksela kandidata i prosječne vri-
jednosti inteziteta rastućeg regiona mora biti unutar definisanog raspona
vrijednosti.
• Razlika izmedu standardane devijacije intenziteta odredenog lokalnog su-
sjedstva piksela kandidata ne smije preći odredeni prag.
Region splitting u osnovi koristi sličnu filozofiju, ali predstavlja obrnut pro-
ces od region growing. Kod region splitting, na početku se cijela slika posmatra
kao jedan region koji se postepeno dijeli u sve manje i manje regione sve dok
se ne dode do stepena kod kojeg bi daljnja podjela rezultirala time da razlika
izmedu susjednih regiona bude ispod nekog predefinisanog praga. Jedan popu-
larni pristup je tzv. split-and-merge algoritam. Algoritam se može podijeliti na
dva stepena: podjelu (split) i spajanje (merge). Cilj podjele regiona je razdvo-
jiti sliku na skup razdvojenih regiona koji su untar samih sebe regularni. etiri

113
114POGLAVLJE 10. LABORATORIJSKE VJEŽBE: SEGMENTACIJA SLIKE - NASTAVAK

osnovna koraka su: Neka je cijela slika početno područje od interesa; Analizirati
cijelo područje i odlučiti da li svi pikseli sadržani unutar regiona zadovoljavaju
kriterij sličnosti; Ako je to istina, onda područje od interesa (takode nazvan blo-
kom) odgovara regionu slike i kao takav je labeliran; Ako nije, tada se područje
od interesa dijeli (obično u četiri jednaka poddijela) i svaki od tih dijelova se
smatra novim područjima od interesa. Ovaj proces se nastavlja sve dok se slika
ne prestane dalje dijeliti. U najgorem slučaju, ovo se može desiti kada površine
ne budu veličine od samo jednog piksela. Ovakva procedura podjele predstavlja
primjer metoda koje se nazivaju divide-and-conquer i top-down metode. Proces
kojim se svaki blok dijeli u četiri jednaka podbloka naziva se quadtree dekom-
pozicija. Nakon svake podjele (split) slijedi proces spajanja (merge) kojim se
susjedni regioni spajaju, ukoliko je to naravno potrebno. Jednom kada više
nema spajanja ili podjele slike, proces segmentacije je završen.

I=imread('lena.gif'); %Ucitavanje slike


S = qtdecomp(I,.17); %quadtree dekompozicija
blocks = repmat(uint8(0),size(S)); %Kreiranje praznih blokova
for dim = [512 256 128 64 32 16 8 4 2 1]; %Prolazak kroz manje blokove
numblocks = length(find(S==dim));
if (numblocks > 0)
values = repmat(uint8(1),[dim dim numblocks]);
values(2:dim,2:dim,:) = 0;
blocks = qtsetblk(blocks,S,dim,values);
end
end
blocks(end,1:end) =1;
blocks(1:end,end) = 1;
subplot(1,2,1), imshow(I);
k=find(blocks==1); %Nalazenje piksela na ivici regiona
A=I; A(k)=255; %Superponiranje na originanu sliku
subplot(1,2,2), imshow(A);

10.2 Metode segmentacije zasnovane na ivicama


Za razliku od prethodno opisanog thresholdinga, metode zasnovane na ivicama
ili granicama su bazirane na nalaženju razlika umjesto nalaženja sličnosti izmedu
piksela slike. Cilj je odrediti zatvorenu ivici tako da unutrašnjost i spoljašnost
te zatvorene ivice može biti definisana, odnosno, budući da svaki objekat može
biti u potpunosti predstavljen preko svojih ivica ili granica, segmentacija slike
u odovjene objekte može biti postignuta nalaženjem ivica tih objekata.
Tipični pristup segmentaciji pomoći ivica je: 1. odrediti sliku koja sadrži
sve moguće ivice originalne slike, 2. obraditi ivice slike tako da ostanu samo one
koje su zatvorene i 3. transformisati rezultat u uobičajenu segmentiranu sliku
ispunom unutar granica objekata.

A=imread('lena.gif'); %Ucitavanje slike


subplot(3,3,1), imshow(A,[]); %Prikaz originalne slike
h1=fspecial('gaussian',[15 15],6);
10.3. WATERSHED SEGMENTACIJA 115

h2=fspecial('gaussian',[30 30],12);
subplot(3,3,4), imshow(imfilter(A,h1),[]); %Prikaz slike filtrirane sa sigma=6
subplot(3,3,7), imshow(imfilter(A,h2),[]); %Prikaz slike filtrirane sa sigma=12
[bw,thresh]=edge(A,'log'); %Detekcija ivica pomo\'{c}u LoG filtera
subplot(3,3,2), imshow(bw,[]);
[bw,thresh]=edge(A,'canny'); %Detekcija ivica pomo\'{c}u Canny filtera
subplot(3,3,3), imshow(bw,[]);
[bw,thresh]=edge(imfilter(A,h1),'log'); %LoG detekcija ivica sa sigma=6
subplot(3,3,5), imshow(bw,[]);
[bw,thresh]=edge(imfilter(A,h1),'canny'); %Canny detekcija ivica sa sigma=6
subplot(3,3,6), imshow(bw,[]);
[bw,thresh]=edge(imfilter(A,h2),'log'); %LoG detekcija ivica sa sigma=12
subplot(3,3,8), imshow(bw,[]);
[bw,thresh]=edge(imfilter(A,h2),'canny'); %Canny detekcija ivica sa sigma=12
subplot(3,3,9), imshow(bw,[]);

10.3 Watershed segmentacija


Watershed segmentacija je dobila ime prema načinu na koji algoritam segmen-
tira sliku u obliku bazena sa vodom. Pojam watershed se odnosi na ivicu koja
dijeli područja u koja se cijede različiti riječni sistemi. Kod ovog algoritma o
slici se razmišlja kao o 3D površini. Ako zamislimo da su svijetla područja vi-
soka, , a tamna niska ili duboka, tada slika izgleda kao površina sa udubljenjima
bazenima (catchment basins). Pretpostavimo da je u svakom regionalnom mi-
nimumu probušena rupa kroz koju se ravnomjerno odozdo puni voda. Kada
voda u pojedinom bazenu (slivu) dode do nivoa da se prelije u drugi podiže se
brana (širine jednog piksela) da to spriječi. Konačni profil tih brana odgovara
linijama vododjelnice čime se izdvajaju konture objekata u slici.
Koraci Watershed algoritma su: Učitati sliku i konvertovati je u grayscale;
Upotrijebiti magnitudu gradijenta kao funkciju segmentacije; Označiti markere
objekata od interesa; Izračunati markere pozadine; Izračunati watershed tran-
sformaciju funkcije segmentacije; Vizuelizirati rezultat.

center1 = -10; %kreiranje slike sa dva spojena kruga.....


center2 = -center1;
dist = sqrt(2*(2*center1)ˆ2);
radius = dist/2 * 1.4;
lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
[x,y] = meshgrid(lims(1):lims(2));
bw1 = sqrt((x-center1).ˆ2 + (y-center1).ˆ2) <= radius;
bw2 = sqrt((x-center2).ˆ2 + (y-center2).ˆ2) <= radius;
bw = bw1 | bw2;
D = bwdist(~bw); % i z r a u n a t i funkciju segmentacije Euclideova distanca
~bw)
subplot(2,2,1), imshow(bw,[]); %prikaz slike
subplot(2,2,2), imshow(D,[]); %prikaz funkcije segmentacije
D = -D; %inverzija i pode\v{s}avanje piksela pozadine da budu ni\v{z}i nego svi
D(~bw) = -inf; %
subplot(2,2,3), imshow(D,[]); %prikaz modifikovane sliek segmentacije
L = watershed(D); subplot(2,2,4), imagesc(L); % r a u n a n j e watershed transformacije
axis image; axis off; colormap(hot); colorbar %prikaz labelirane slike
116POGLAVLJE 10. LABORATORIJSKE VJEŽBE: SEGMENTACIJA SLIKE - NASTAVAK

A=imread('coins.png'); % u i t a v a n j e slike
bw=im2bw(A,graythresh(A)); %automatski threshold
se=strel('disk',10); bwo=imopen(bw,se); %uklanjanje pozadine primjenom morfolo\v{s}kog
D = bwdist(~bwo); % r a u n a n j e funkcije segmentacije
D = -D; D(~bwo) = -255; %inverzija
L = watershed(D); % r a u n a n j e watershed transformacije
figure, subplot(1,4,1), imshow(A); %prikaz slike
subplot(1,4,2), imshow(bw) %thresholdovana slika
subplot(1,4,3), imshow(D,[]); %prikaz funkcije segmentacije
ind=find(L==0); Ac=A; Ac(ind)=0; %identificiranje watersheds
subplot(1,4,4), imshow(Ac,[]); hold on

I jedan primjer prekomjerne segmentacije.

A=imread('overlapping euros.jpg');
Agrad=ordfilt2(A,25,ones(5))-ordfilt2(A,1,ones(5)); %racunanje funkcije segmentacije
figure, subplot(1,3,1), imshow(A,[]);
subplot(1,3,2), imshow(Agrad,[]);

L = watershed(Agrad), rgb = label2rgb(L,'hot',[.5 .5 .5]); %racunanje watershade algoritma


subplot(1,3,3), imshow(rgb,'InitialMagnification','fit');

10.4 Aktivne konture


Aktivne konture ili snake predstavljaju kontrolisane kontinualne konture koje se
elastično obavijaju oko željenog objekta čuvajući njegove ivice. Snake se može
kontrolisati pomoću funkcije koja se naziva energijom slično kao kod fizikanih
sistema. Snake je aktivna, jer kontinualno raste s ciljem reduciranja energije.
Definisanjem odgovarajuće funkcije energije može se postići da snake raste tako
da ima odredene osobine kao što je glatkost. Funkcija energije se sastoji od dva
dijela, unutrašnje i vanjske energije Esnake = Einternal + Eexternal .

I = imread('coins.png');
imshow(I)
title('Originalna slika');
mask = zeros(size(I));
mask(25:end-25,25:end-25) = 1;
figure, imshow(mask);
title('Pocetna lokacija konture');
bw = activecontour(I,mask,300);
figure, imshow(bw);
title('Segmentirana slika');

10.5 K-means clustering


K-means clustering zasniva se na vektorskoj kvantizaciji intenziteta ili boje.
Clusteri ne moraju biti prostorno koherentni.

im=imread('coins.png');
10.5. K-MEANS CLUSTERING 117

k=2; %broj clustera slike


%Racunanje histograma
img hist = zeros(256,1);
hist value = zeros(256,1);

for i=1:256
img hist(i)=sum(sum(im==(i-1)));
end;
for i=1:256
hist value(i)=i-1;
end;
%inicijalizacija clustera
cluster = zeros(k,1);
cluster count = zeros(k,1);
for i=1:k
cluster(i)=uint8(rand*255);
end;

old = zeros(k,1);
while (sum(sum(abs(old-cluster))) >k)
old = cluster;
closest cluster = zeros(256,1);
min distance = uint8(zeros(256,1));
min distance = abs(hist value-cluster(1));

%racuanje minimalne distance do clustera


for i=2:k
min distance =min(min distance, abs(hist value-cluster(i)));
end;

%racunanje najblizeg clustera


for i=1:k
closest cluster(min distance==(abs(hist value-cluster(i)))) = i;
end;

%racuanje zbira clustera


for i=1:k
cluster count(i) = sum(img hist .*(closest cluster==i));
end;

for i=1:k
if (cluster count(i) == 0)
cluster(i) = uint8(rand*255);
else
cluster(i) = uint8(sum(img hist(closest cluster==i).*hist value(closest cluster==i))/cluster c
end;
end;

end;
imresult=uint8(zeros(size(im)));
for i=1:256
imresult(im==(i-1))=cluster(closest cluster(i));
end;

clustersresult=uint8(zeros(size(im)));
for i=1:256
118POGLAVLJE 10. LABORATORIJSKE VJEŽBE: SEGMENTACIJA SLIKE - NASTAVAK

clustersresult(im==(i-1))=closest cluster(i);
end;

clusters = cluster;
result image = imresult;
clusterized image = clustersresult;

figure
subplot(1,2,1), imshow(im)
subplot(1,2,2), imshow(result image)

You might also like