Title: DIGITALNA OBRADA SLIKE
1DIGITALNA OBRADA SLIKE
- Softver za obradu slike
- Ognjen Joldžic, 21/04
- Zlatko Dejanovic, 16/04
- Daniel Kurtjak, 50/04
2Zadaci
- kreirati softver za obradu slike (rad sa binarnim
slikama) - potrebne funkcije
- - isjecanje
- - brisanje
- - invertovanje
- - rotacija (za n90, slika u ogledalu)
- - detekcija iskošenja i ispravljanje
- - uklanjanje šuma
- proizvoljna tehnologija za implementaciju
3Proširenja osnovnog zadatka
- rad sa slikama u boji i sivim slikama
- rad sa histogramima
- morfologija
- dodavanje šuma
- konverzija tipova slika
- undo opcija
4Osnovni koncepti implementacije
- C (.NET 2.0)
- modularni pristup
- jednostavno unapredivanje
SlikaLib
Geometrijske operacije (Ognjen.dll)
Morfološke operacije (Zlatko.dll)
Detekcija zakrivljenja (SkewDetection.dll)
Filtriranje (Kurtjak.dll)
Osnovni interfejs
5Podržani tipovi slika
- bmp
- jpeg
- png
- gif
- tiff
- moguca konverzija izmedu svih tipova
6Osnovni interfejs
Glavni prozor
Prozori za slike
7SlikaLib
- biblioteka sa osnovnim klasama
- distribucija u vidu .dll datoteke
- objekti u osnovnoj klasi (Slika)
- - objekat klase Bitmap (.NET)
- - width (int)
- - height (int)
- - ImgType (RGB, Gray, Binary)
- - ostale vrijednosti (buffer, maxValue,
minValue...)
8Osnovne operacije
- Crop (isijecanje)
- - zadržavanje selektovanog dijela slike
Slika rez new Slika(sirina, visina,
original.ImageType) for (int i ax, m
0 i lt ax sirina i, m) for
(int j ay, n 0 j lt ay visina j, n)
if (original.ImageType
imgType.rgb)
rez.setPixelRGBAt(m, n, original.getPixelRGBAt(i,
j)) else
rez.setPixelAt(m, n, original.getPixelAt(i, j))
return rez
9Osnovne operacije
- Cut
- - funkcija suprotna crop
- - selektovani dio slike se odbacuje
- Negativ
- - kreiranje inverzne slike
- - zavisi od tipa (u boji, siva, binarna)
10Osnovne operacije
- Rotacija za n90
- - n1
- - promjena dimenzija slike
- Slika u ogledalu (flip)
- - u odnosu na vertikalnu osu
- - u odnosu na horizontalnu osu
- - dimenzije slike su iste
11Osnovne operacije
- Konverzija broja boja
- - RGB -gt Siva -gt Binarna
- - obrnuta konverzija nije moguca
- - neke funkcije moguce samo za odredeni tip
slike - - jednostavni algoritmi za konverziju
12Matematicka morfologija
- Strukturni element
- - opis
- - podešavanje
- - struktura u memoriji
- - primjer osnovnog strukturnog elementa
- (-1,-1), (-1,0), (-1,1), (0,-1), (0,0), (0,1),
- (1,-1), (1,0), (1,1)
13Matematicka morfologija
- Dilatacija
- - proširivanje slike
- - osnovne ideje realizacije
- - funkcije getFirst() i hasNext()
- - rubni pikseli
- - smještanje rezultata
14Matematicka morfologija
- public static Slika dilatacija(Slika slika)
-
- if ((strElement ! null)
(strElement.hasElement())) -
- Slika copy slika.getImgCopy()
- Slika s new Slika(copy.Width,
copy.Height, imgType.binary) - for (int i 0 i lt s.Width i)
- for (int j 0 j lt s.Height
j) - s.setPixelAt(i, j, 1)
- for (int i 0 i lt copy.Width i)
- for (int j 0 j lt copy.Height
j) - if (copy.getPixelAt(i, j)
0) -
- element e
strElement.getFirst() - if (!(((e.x i) lt 0)
((e.x i) gt copy.Width) - ((e.y j) lt 0) ((e.y
j) gt copy.Height))) - s.setPixelAt((e.x i),
(e.y j), 0) - while (strElement.hasNext())
-
15Matematicka morfologija
- Erozija
- - eliminisanje rubnih piksela slike
- - osnovne ideje slicne kao kod dilatacije
- - uvodenje logicke promjenljive flag koja
odreduje da li ce piksel biti iscrtan
16Matematicka morfologija
- public static Slika erozija(Slika slika)
-
- if ((strElement ! null)
(strElement.hasElement())) -
- Slika copy slika.getImgCopy()
- Slika s new Slika(copy.Width,
copy.Height, imgType.binary) - for (int i 0 i lt s.Width i)
- for (int j 0 j lt s.Height
j) - s.setPixelAt(i, j, 1)
- for (int i 0 i lt copy.Width i)
- for (int j 0 j lt copy.Height
j) - if (copy.getPixelAt(i, j)
0) -
- bool flag true
- element e
strElement.getFirst() - if (!(((e.x i) lt 0)
((e.x i) gt copy.Width) - ((e.y j) lt 0) ((e.y
j) gt copy.Height))) - if (copy.getPixelAt((e.x
i), (e.y j)) 1) - flag false
17Matematicka morfologija
- Primjer (original, dilatacija, erozija)
18Matematicka morfologija
- Otvaranje
- - erozija dilatacija istim str.el.
- public static Slika otvaranje(Slika s)
-
- return dilatacija(erozija(s))
19Matematicka morfologija
- Zatvaranje
- - dilatacija erozija istim str.el.
- public static Slika zatvaranje(Slika s)
-
- return erozija(dilatacija(s))
20Filtriranje
- Filteri
- - uniformni
- - Gausov
- - median
- - Laplasov
- Šumovi
- - salt pepper
21Filtriranje
- osnovne ideje
- obracanje pažnje na rubne piksele funkcijom
getImgBoundary() - analogija sa Matlab-om u realizaciji funkcija
imFilter() i fSpecial() - podrazumijevani parametri
22Filtriranje
Salt Paper
Average
Gauss
Median
Laplacian
23Filtriranje
- public static Slika imFilter(Slika slika,
float, kernel, int sirina, int visina, string
ivicniTip) -
- ...
- for (int i 0 i lt copy.Width i)
- for (int j 0 j lt copy.Height
j) -
- float, f
getImgBoundary(copy, sirina, visina, i, j,
ivicniTip) - float sum 0
- for (int ii 0 ii lt sirina
ii) - for (int jj 0 jj lt
visina jj) - sum fii, jj
kernelii, jj -
- ...
- return slika
-
- public static float, getImgBoundary(Slika
slika, int sirina, int visina, int red, int
kolona, string ivicniTip) -
- if (ivicniTip.Equals("zeros"))
- . . .
24Filtriranje
- public static float, fSpecial(string type, int
width, int height, float sigma, float alpha) -
- float, f new floatwidth,
height - if (type.Equals("average"))
- . . .
- else if (type.Equals("laplacian"))
- . . .
- else if (type.Equals("gaussian"))
- . . .
- return f
25Filtriranje
- Median filtar
- public static Slika medfilt2(Slika slika, int
sirina, int visina, string boundaryType) -
- slika.makeBuffer()
- Slika copy slika.getImgCopy()
- for (int i 0 i lt copy.Width i)
- for (int j 0 j lt copy.Height
j) -
- float, f
getImgBoundary(copy, sirina, visina, i, j,
boundaryType) - for (int ii 0 ii lt sirina
visina - 1 ii) - for (int jj ii jj lt
sirina visina jj) - if (fii / sirina, ii
sirina gt fjj /sirina, jj sirina) -
- float tmp fii
/ sirina, ii sirina - fii / sirina, ii
sirina fjj / sirina, jj sirina - fjj / sirina, jj
sirina tmp -
- slika.setPixelAt(i, j,
fsirina / 2, visina / 2) -
26Filtriranje
- Salt pepper šum
- public static Slika imNoise(Slika s, string
noiseType, float freq) -
- if (noiseType.Equals("salt
pepper")) -
- int f (int)(freq 100)
- Random r new Random()
- for (int i 0 i lt s.Width i)
- for (int j 0 j lt s.Height
j) -
- int rdm r.Next(0, 100)
- if (rdm lt f / 2)
- s.setPixelAt(i, j,
0) - else if (rdm gt (100 - f
/ 2)) - s.setPixelAt(i, j,
1) -
- return s
-
- throw new Exception("Nije dobar
parametar")