vezba 7 - kompleksna obrada slike.pdf
Post on 27-Sep-2015
49 Views
Preview:
TRANSCRIPT
-
1
Elementi digitalne obrada slike u MATLAB-u
____________________________________________________
injenica je da je u savremenom ivotu jako esto potrebno modifikovati slike da bi se dobila
zadovoljavajua forma. Postoji veliki broj programskih paketa koji omoguavaju da se ta obrada izvri na
prilino jednostavan nain. Iako, ponekad korienje alata za obradu slike u tim paketima deluje prilino
jednostavno, ako se zagrebe malo dublje ispod povrine, shvata se da je u pitanju kompleksan i nadasve
veoma delikatan aparat.
U okviru ove skripte, bie dat prikaz reavanja osnovih problema digitalne obrade slike iz aspekta
Matlaba. Polazna taka je injenica da se slike u MATLAB- u prikazuju u formi matrica. Da bi se bilo koja
slika obradila, potrebno je ustvari obraditi matricu koja je predstavlja. U daljem tekstu bie prikazani
neki od osnovnih elemenata obrade slike koji se koriste u alatima potrebnim grafikim inenjerima I
dizajnerima u reavanju postavljenih problema. Pod tim alatima se prevashodno misli na Corel Draw i
Photoshop. Ovim softverskim paketima je omogueno da se na jednostavan nain uz pomo grafikog
interfejsa vri i najkompleksnija obrada slike. U svakom sluaju, takav pristup esto zadovoljava potrebe
grafikih inenjera i dizajnera, meutim svakako je neophodno poznavati kako je dolo do izrade tih
alata u okviru ovih programskih paketa koji nam slue za kompleksnu obradu slike. Svakako,
modifikacijom naina koji e biti prikazani u ovom tekstu, mogue je i modifikovati i usavriti ve
predloene algoritme u digitalnoj obradi slike.
itanje slika
f = imread('example1.jpg');
Funkcija koja omoguava itanje slika je funkcija imread. Ona omoguava da se kao parameter zada slika koju je potrebno obraditi I da se njena vrednost uita u promenljivu (u ovom sluaju f) koja predstavlja matricu.
Prikaz slika
imshow(f,[180 200])
Sliku je mogue prikazati pomou funkcije imshow koja kao ulazne parameter moe imati jedan ili dva parametra. Prvi parameter je promenljiva tipa matrice koja ustari predstavalja sliku. Drugi parameter predstavlja broj stepeni inteziteta slike koji se prikazuje. Ukoliko se ne zada taj parameter, broj je broj stepeni inteziteta slike je 256.
-
2
Pisanje slika (uvanje slika)
imwrite(f, 'jpgexample1.jpg', 'quality', 50)
Funkcija imwrite slui da se matrica koji je prvi parameter funkcije sauva kao fajl koji je drugi parameter funkcije. Lepa osobina ove funkcije je da moe kao da ima I druge parameter. U sluaju slike tipa jpg, moe da prima parameter quality koji ima vrednost od 0 do 100. to je vrednost manja to je ve degradacija slike usled JPEG kompresije. Ukoliko je slika tiff tipa, onda je, na primer mogue smanjiti rezoluciju slike kao u datom primeru. imwrite(fjpg, 'tifexample1.tif', 'resolution' ,[300 300])
Informacija o slikama
lowquality = imfinfo('jpgexample1.jpg')
Informacije o slici se dobijaju putem funkcije iminfo koja kao parameter prima ime fajla koji predstavlja sliku. U izlaznu promenljivu (tipa strukture) se upisuju podaci o slici: lowquality =
Filename: 'G:\Program Files\MATLAB\R2011b\bin\Graficari
Vezbe\Kompleksna obrada slike\jpgexample1.jpg'
FileModDate: '20-Nov-2012 10:44:01'
FileSize: 21027
Format: 'jpg'
FormatVersion: ''
Width: 500
Height: 500
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}
Izvrtanje slike
f = imread('example1.jpg'); reverseimg = f(end:-1:1, :,:); imshow(reverseimg)
Izvrtanje slike se radi na nain kao to je prikazano u poslednjem segmentu koda. Sutina je u izvrtanju samo dimenzije koja predstavlja vrste matrice.
-
3
Slika 1. Primer izvrtanja slike
Isecanje segmenta slike
Nain 1.
f = imread('example1.jpg'); croppedimg = f(200:400, 200:400, :); imshow(croppedimg)
Isecanje se jednostavno vri tako to se odabere segment slike po obe ose koji eli da se isee, na nain koji je prikazan u kodu. To ustvari znai da se izaberu iz slike vrste I kolone koje se trebaju prikazati.
Nain 2.
[s1,s2,s3] = size(f); figure(7) image(f) [x y] = ginput(2); x1=x(1); x2=x(2); y1=y(1); y2=y(2); x1= round (x1); x2= round (x2); y1= round (y1); y2= round (y2); if (x1=y2)
-
4
croppedimg2 = f(x2:x1, y2:y1, :); elseif (x1>x2) & (y1
-
5
Slika 3. Originalna slika
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
6
Slika 4. Smanjeni detalji na slici
Prikaz slike u grayscale formatu
Da bi se slika iz RGB formata prebacila u grayscale format, potrebno je vrednosti R, G i B komponente
usredniti ((R+G+B)/3) i dodeliti opet svakoj od tih komponenti tu srednju vrednost. Predstavljeno u
Matlab kodu to izgleda ovako:
s = imread('rome.jpg'); [s1,s2,s3] = size(s);
for i=1:s1 for j=1:s2 p(i,j)= mean([s(i,j,1),s(i,j,2),s(i,j,3)]); p(i,j)= round(p(i,j)); end end for i =1:s1 for j =1:s2
for k=1:3 s(i,j,k)=p(i,j); end
end end
20 40 60 80 100 120 140
10
20
30
40
50
60
70
80
90
100
110
-
7
image(s)
Slika 5. Slika u grayscale formatu
Slika u bit-ovnim ravnima
Svaka slika se moe predstaviti u bitovnim ravnima. Takva predstava slike se moe shvatiti kao sekvenca
binarnih slika. Slika u Matlabu je u osnovi 3D matrica kojoj je trea dimenzija veliine 3 (R, G i B
komponenta). Predstava ovakve slike u bitovnim ravnima podrazumeva predstavu vrednosti R, G i B
komponente, koja u osnovi uzima vrednsti od 0 do 255 u binarnom zapisu. Poto brojeve od 0 do 255
moemo predstaviti sa 8 bita (2 = 256), onda crtamo za svaki piksel slike svaki od 8 bitova
(standardizovano je da se poslednji bit oznaava kao 0-ti bit, a prvi kao 7-mi).
U Matlab kodu ispod je dat jedan od naina kako da se izvede ova podela na bitovne ravni. Matlab kod je
dat u segmentima.
%% ucitavanje slike u matricu
s = imread('rome.jpg'); [s1,s2,s3] = size(s);
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
8
%% pravljenje grayscale slike od RGB slike for i=1:s1 for j=1:s2 p(i,j)= mean([s(i,j,1),s(i,j,2),s(i,j,3)]); p(i,j)= round(p(i,j)); end end
%% prebacivanje u binarni zapis
for i=1:s1 for j=1:s2
spom(i,j,1) = idivide(uint8(p(i,j)),128); bit7rest = mod(p(i,j),128); spom(i,j,2) = idivide(uint8(bit7rest),64); bit6rest = mod(bit7rest,64); spom(i,j,3) = idivide(uint8(bit6rest),32); bit5rest = mod(bit6rest,32); spom(i,j,4) = idivide(uint8(bit5rest),16); bit4rest = mod(bit5rest,16); spom(i,j,5) = idivide(uint8(bit4rest),8); bit3rest = mod(bit4rest,8); spom(i,j,6) = idivide(uint8(bit3rest),4); bit2rest = mod(bit3rest,4); spom(i,j,7) = idivide(uint8(bit2rest),2); bit1rest = mod(bit2rest,2); spom(i,j,8) = idivide(uint8(bit1rest),1); bit0rest = mod(bit1rest,1);
end end
%% vracanje sve 3 komponente na vrednost 0 ili 255 (0 za vrednost bita 0 i %% 255 za vrednost bita 1) da bi se prikazala crna ili bela boja na slici
for i =1:s1 for j =1:s2 for m=1:8 for k=1:3 s(i,j,m,k)=spom(i,j,m)*255; end end end end
% crtanje odgovarajuce bitovne ravni
figure(9) s3d = zeros(s1,s2,s3); s3d = s(:,:,4,:); s3d2 = reshape(s3d,s1,s2,s3); image(s3d2)
-
9
Slika 6. 7-bitovna ravan
Slika 7. 4-bitovna ravan
100 200 300 400 500 600
50
100
150
200
250
300
350
400
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
10
Slika 8. 1-bitovna ravan
Sa slika se moe primetiti da prikaz bitovne ravni bita veeg znaaja daje vie detalja o slici, dok ta
koncentracija detalja progresivno opada sa prikazom bitovnih ravni manjeg znaaja.
Posvetljivanje slike
Posvetljivanje slike moe da se vri na vie naina. Svakako jedan je da se na vrednost svakog piksela
doda odgovarajua konstanta. Treba napomenuti da za vrednosti koje postaju vee od 255 treba uvesti
ogranienje da su one upravo jednake 255 jer je to najvea vrednost koju svaka od komponenti moe
dobiti. Drugi nain posvetljivanja slike je umnoavanjem svakog piksela nekim umnokom. Kako to zaista
izgleda za odgovarajue vrednosti dodavanja konstante i umnoavanjem umnokom moete videti na
slikama.
for i=1:s1 for j=1:s2 for k=1:3 if s(i,j,k)>180 s(i,j,k)=255; else s(i,j,k)= s(i,j,k)+75;
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
11
end end end end
Slika 9. Uveanje svake komponente svakog piksela za konstantu 75
for i=1:s1 for j=1:s2 for k=1:3 if s(i,j,k)*3>255 s(i,j,k)=255; else s(i,j,k)= s(i,j,k)*3; end end end end
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
12
Slika 10. Umnoavanje svake komponente svakog piksela 3 puta.
Potamljivanje slike
Potamljivanje slike moe da se vri na vie naina. Svakako jedan je da se od vrednosti svakog piksela
oduzme odgovarajua konstanta. Treba napomenuti da vrednosti koje postaju manje od 0 treba
ograniiti da one postanu upravo jednake 0 jer je to najmanja vrednost koju svaka od komponenti moe
imati. Drugi nain posvetljivanja slike je deljenje svakog piksela nekom konstantom. Kako to zaista
izgleda za odgovarajue vrednosti dodavanja konstante i umnoavanjem umnokom moete videti na
slikama.
for i=1:s1 for j=1:s2 for k=1:3 if s(i,j,k)-75
-
13
Slika 11. Smanjivanje svake komponente svakog piksela za konstantu 75
for i=1:s1 for j=1:s2 for k=1:3 s(i,j,k)= round(s(i,j,k)/3); end end end
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
14
Slika 12. Smanjivanje svake komponente svakog piksela 3 puta.
Zaumljivanje slike So i biber (Salt and Peper)
um predstavlja degradaciju signala slike uzrokovanu spoljanjim poremeajem. Konkretno, um tipa so i
biber je uzrokovan otrim, iznenadnim poremeajem u signalu slike. Ustvari, on moe biti prikazan
nasumino razmetenim crnim i/ili belim pikselima po originalnoj slici.
s = imread('rome.jpg'); [s1,s2,s3] = size(s) figure(1) image(s)
% sluajno izabran stepen suma noise_level=(rand(1)/2); % broj redova i kolona koji su podlozni sumu number_of_rowsUN = round(noise_level*s1); number_of_columnsUN = round(noise_level*s2);
for i =1:number_of_rowsUN for j =1:number_of_columnsUN % m predstavlja red na koji deluje sum m=round(s1*rand); % ako je red = 0, onda automatski postaje red = 1, posto % ne moze biti 0-ti red slike if m==0
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
15
m=1; end % n predstavlja kolonu na koju deluje sum n=round(s2*rand);
% ako je kolona = 0, onda automatski postaje kolona = 1, posto % ne moze biti 0-ta kolona slike if n==0 n=1; end % promenljiva pom sluzi da bi u zavisnosti od njene vrednosti (0,1) % tacka suma bila bela ili crna pom = round(rand); if pom ==0 s(m,n,1)=255; s(m,n,2)=255; s(m,n,3)=255; else
s(m,n,1)=0; s(m,n,2)=0; s(m,n,3)=0; end end end figure(2) image(s)
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
16
Slika 13. Prikaz slike zaumljene so i biber umom
Zaumljivanje slike Gausov um (Gaussian noise)
Gausov um predstavalja idealizovan beli um, a moe biti objanjen nasuminim fluktuacijama signala. s = imread('rome.jpg'); [s1,s2,s3] = size(s) figure(1) image(s)
% sluajno izabran stepen suma noise_level=(rand(1)/2); % broj redova i kolona koji su podlozni sumu number_of_rowsUN = round(noise_level*s1); number_of_columnsUN = round(noise_level*s2);
for i =1:number_of_rowsUN for j =1:number_of_columnsUN % m predstavlja red na koji deluje sum m=round(s1*rand); % ako je red = 0, onda automatski postaje red = 1, posto % ne moze biti 0-ti red slike if m==0 m=1; end % n predstavlja kolonu na koju deluje sum n=round(s2*rand);
% ako je kolona = 0, onda automatski postaje kolona = 1, posto % ne moze biti 0-ta kolona slike if n==0 n=1; end % nasumicne fluktuacije signala s(m,n,1)=round(255*rand); s(m,n,2)=round(255*rand); s(m,n,3)=round(255*rand);
end end figure(2) image(s)
-
17
Slika 14. Prikaz slike zaumljene Gausovim umom
Zaumljivanje slike Umrljani um (Speckle noise)
Ovaj tip zaumljivanja je est problem u aplikacijama vezanim za radare. Umrljani um je ustvari
modelovan tako to se vrednosti pisksela mnoe sa sluajno izabranim vrednostima.
s = imread('rome.jpg'); [s1,s2,s3] = size(s) figure(1) image(s)
% sluajno izabran stepen suma noise_level=(rand(1)/2); % broj redova i kolona koji su podlozni sumu number_of_rowsUN = round(noise_level*s1); number_of_columnsUN = round(noise_level*s2);
for i =1:number_of_rowsUN for j =1:number_of_columnsUN % m predstavlja red na koji deluje sum m=round(s1*rand); % ako je red = 0, onda automatski postaje red = 1, posto % ne moze biti 0-ti red slike
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
18
if m==0 m=1; end % n predstavlja kolonu na koju deluje sum n=round(s2*rand);
% ako je kolona = 0, onda automatski postaje kolona = 1, posto % ne moze biti 0-ta kolona slike if n==0 n=1; end % slucajne vrednosti koje se mnoze sa vrednostima piksela s(m,n,1)=round(s(m,n,1)*rand); s(m,n,2)=round(s(m,n,2)*rand); s(m,n,3)=round(s(m,n,3)*rand);
end end figure(2) image(s)
Slika 15. Prikaz slike zaumljene umrljanimr umom
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
19
Prebacivanje iz RGB u HSV prikaz
Prebacivanje iz RGB prikaza u HSV prikaz je vrlo jednostavno i vri se funkcijom rgb2hsv. Ulazni
parametar ove funkcije je matrica koja ustvari predstavlja RGB sliku. Izlazni parapetar je takoe matrica
koja predstavlja HSV sliku.
m = rgb2hsv(s)
Slika 16. Prikaz slike u HSV formatu
Rastavljanje RGB slike na komponente
Pod rastavljem slike na komponente se podrazumeva nezavisan prikaz svake od komponenti RGB slike,
znai komponente R,G i B.
s = imread('rome.jpg'); [s1,s2,s3] = size(s);
for i=1:s1 for j=1:s2
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
20
s(i,j,1)=s(i,j,1); s(i,j,2)=0; s(i,j,3)=0; end end figure(1) image(s)
s = imread('rome.jpg'); for i=1:s1 for j=1:s2 s(i,j,1)=0; s(i,j,2)=s(i,j,2); s(i,j,3)=0; end end figure(2) image(s)
s = imread('rome.jpg'); for i=1:s1 for j=1:s2 s(i,j,1)=0; s(i,j,2)=0; s(i,j,3)=s(i,j,3); end end figure(3) image(s)
Slika 17. Prikaz slike po komponenti R
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
21
Slika 18. Prikaz slike po komponenti G
Slika 19. Prikaz slike po komponenti B
100 200 300 400 500 600
50
100
150
200
250
300
350
400
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
22
Rastavljanje HSV slike na komponente
HSV slika je ustvari prikaz palete boja koja je prikazana u formi cilindra. H komponenta ima vrednosti od
0 do 360 i predstavlja ugao oko centralne ose. Udaljenost od centralne ose predstavlja komponenta S
(saturacija opseg od 0 do 1), a rastojanje du te ose komponenta V (vrednost value, opseg od 0 do 1).
Obojenost (hue) bi mogla da se objasni kao promena boje piksela, saturacija kao veliina koja odreuje
koliko je boja razblaena belom, dok je vrednost ustvari vrednost osvetljenosti boje (koliina svetlosti 0
crni pikseli, koliina svetlosti 1 beli pikseli).
Slika 20. Izgled HSV cilindra
Rastavljanje ovog formata na komponente se vri kao to je prikazano kodom, a izgled komponenti dat
je na narednim slikama.
m = imread('rome.jpg'); [s1,s2,s3] = size(m) figure(1) image(m)
s = rgb2hsv(m); figure(2) image(s)
for i=1:s1 for j=1:s2 f(i,j,1)=s(i,j,1); f(i,j,2)=0; f(i,j,3)=0; end end figure(3) image(f)
for i=1:s1
-
23
for j=1:s2 f(i,j,1)=0; f(i,j,2)=s(i,j,2); f(i,j,3)=0; end end figure(4) image(f)
for i=1:s1 for j=1:s2 f(i,j,1)=0; f(i,j,2)=0; f(i,j,3)=s(i,j,3); end end figure(5) image(f)
Slika 21. Prikaz slike po komponenti H
100 200 300 400 500 600
50
100
150
200
250
300
350
400
-
24
Slika 22. Prikaz slike po komponenti S
Slika 23. Prikaz slike po komponenti V
100 200 300 400 500 600
50
100
150
200
250
300
350
400
100 200 300 400 500 600
50
100
150
200
250
300
350
400
top related