vezba 7 - kompleksna obrada slike.pdf

24
1 Elementi digitalne obrada slike u MATLAB-u ____________________________________________________ Činjenica je da je u savremenom životu jako često potrebno modifikovati slike da bi se dobila zadovoljavajuća forma. Postoji veliki broj programskih paketa koji omogućavaju da se ta obrada izvrši na prilično jednostavan način. Iako, ponekad korišćenje alata za obradu slike u tim paketima deluje prilično jednostavno, ako se zagrebe malo dublje ispod površine, shvata se da je u pitanju kompleksan i nadasve veoma delikatan aparat. U okviru ove skripte, biće dat prikaz rešavanja osnovih problema digitalne obrade slike iz aspekta Matlaba. Polazna tačka 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 biće prikazani neki od osnovnih elemenata obrade slike koji se koriste u alatima potrebnim grafičkim inženjerima I dizajnerima u rešavanju postavljenih problema. Pod tim alatima se prevashodno misli na Corel Draw i Photoshop. Ovim softverskim paketima je omogućeno da se na jednostavan način uz pomoć grafičkog interfejsa vrši i najkompleksnija obrada slike. U svakom slučaju, takav pristup često zadovoljava potrebe grafičkih inženjera i dizajnera, međutim svakako je neophodno poznavati kako je došlo do izrade tih alata u okviru ovih programskih paketa koji nam služe za kompleksnu obradu slike. Svakako, modifikacijom načina koji će biti prikazani u ovom tekstu, moguće je i modifikovati i usavršiti već predložene algoritme u digitalnoj obradi slike. Čitanje slika f = imread('example1.jpg'); Funkcija koja omogućava čitanje slika je funkcija imread. Ona omogućava da se kao parameter zada slika koju je potrebno obraditi I da se njena vrednost učita u promenljivu (u ovom slučaju f) koja predstavlja matricu. Prikaz slika imshow(f,[180 200]) Sliku je moguće prikazati pomoću funkcije imshow koja kao ulazne parameter može 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.

Upload: marko-katic

Post on 27-Sep-2015

48 views

Category:

Documents


3 download

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