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

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.
1

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.

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<=x2) & (y1<=y2)
croppedimg2 = f(x1:x2, y1:y2, :);
elseif (x1<=x2) & (y1>y2)
croppedimg2 = f(x1:x2, y2:y1, :);
elseif (x1>x2) & (y1>=y2)

croppedimg2 = f(x2:x1, y2:y1, :);


elseif (x1>x2) & (y1<y2)
croppedimg2 = f(x2:x1, y1:y2, :);
end
image(croppedimg2)

20
40
60
80
100
120
140
160
20

40

60

80

100

120

140

Slika 2. Isecanje dela slike selektovanog misem

U okviru naina 2. obezbeeno je isecanje dela slike tako to se segment slike koji eli da se isee obelei
korienjem mia I to ako se omogui da se klikne na mesto koje predstavlja jedan oak nove iseene
slike, a zatim na mesto koje predstavlja drugi oak iseene slike (dijagonalan u odnosu na prvi).

Smanjivanje detalja u slici


s = imread('rome.jpg');
figure(8)
image(s);
subsampimg = s(1:4:end, 1:4:end,:);
waitforbuttonpress
image(subsampimg)

U konkretnom segment kod uzimamo samo vrste I kolone koji nam predstavljaju svaku etvrtu liniju
slike po vertikali I horizontali.

50
100
150
200
250
300
350
400
100

200

300

400

500

600

Slika 3. Originalna slika

10
20
30
40
50
60
70
80
90
100
110
20

40

60

80

100

120

140

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

image(s)

50
100
150
200
250
300
350
400
100

200

300

400

500

600

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);

%% 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)

50
100
150
200
250
300
350
400
100

200

300

400

500

600

Slika 6. 7-bitovna ravan

50
100
150
200
250
300
350
400
100

200

300

400

500

600

Slika 7. 4-bitovna ravan

50
100
150
200
250
300
350
400
100

200

300

400

500

600

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;

10

end
end
end
end

50
100
150
200
250
300
350
400
100

200

300

400

500

600

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

11

50
100
150
200
250
300
350
400
100

200

300

400

500

600

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<0
s(i,j,k)=0;
else
s(i,j,k)= round(s(i,j,k)-75);
end
end
end
end

12

50
100
150
200
250
300
350
400
100

200

300

400

500

600

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

13

50
100
150
200
250
300
350
400
100

200

300

400

500

600

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

14

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)

50
100
150
200
250
300
350
400
100

200

300

400

500

600

15

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)

16

50
100
150
200
250
300
350
400
100

200

300

400

500

600

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

17

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)

50
100
150
200
250
300
350
400
100

200

300

400

500

600

Slika 15. Prikaz slike zaumljene umrljanimr umom

18

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)

50
100
150
200
250
300
350
400
100

200

300

400

500

600

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

19

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)

50
100
150
200
250
300
350
400
100

200

300

400

500

600

Slika 17. Prikaz slike po komponenti R

20

50
100
150
200
250
300
350
400
100

200

300

400

500

600

500

600

Slika 18. Prikaz slike po komponenti G

50
100
150
200
250
300
350
400

100

200

300

400

Slika 19. Prikaz slike po komponenti B

21

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

22

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)

50
100
150
200
250
300
350
400
100

200

300

400

500

600

Slika 21. Prikaz slike po komponenti H

23

50
100
150
200
250
300
350
400
100

200

300

400

500

600

Slika 22. Prikaz slike po komponenti S

50
100
150
200
250
300
350
400
100

200

300

400

500

600

Slika 23. Prikaz slike po komponenti V

24

You might also like