Kernel (pilditöötlus)

Pilditöötluses nimetatakse **kernelit** ehk **konvolutsioonimaatriksit** väikesemõõduliseks maatriksiks, mida kasutatakse erinevateks pilditöötlusvõteteks nagu udustamine, teravustamine, serva leidmine jpm.
Soovitud tulemuse saavutamiseks konvoleeritakse omavahel pilti ja kernelit.

## Üksikasjad
### Matemaatiline kuju

Konvolutsiooni võib valemina lahti kirjutada järgmiselt:
Rumptf (def.7)
g(x,y)= \omega *f(x,y)=\sum_{dx=-a}^a{\sum_{dy=-b}^b{ \omega (dx,dy)f(x-dx,y-dy)}},

kus g(x,y) on filtreeritud pilt ehk lõpptulemus, f(x,y)
 on esialgne pilt, \omega on kernel. Kerneli elementide tähistuseks on -a \leq dx \leq a  ja -b \leq dy \leq b.

### Kasutusnäiteid
Sõltuvalt kerneli väärtustest on võimalik luua pildil laia vahemikuga efekte.

### Kerneli suurus
Konvolutsiooniga kaasneb üks suur probleem – vajaminevate arvutustehete hulk, mis kasvab koos sisendi suuruse kasvuga. Näiteks kui tahta konvoleerida 512x512 piksli suurust pilti 64x64 piksli suuruse kerneliga, siis kuluks selleks rohkem kui miljard korrutus- ja liitmistehet. Liiga pikk täitmisaeg võib muuta arvutustehnika kasutuks. Selle tõttu on väga laialt levinud väikesed 3x3 piksli suurused kernelid, mida libistatakse üle originaalpildi. Sellise suurusega kernel võimaldab tegelikult üllatavalt häid tulemusi, sest ta on samas piisavalt suurte mõõtmetega, et mõjutada pildi servasid.
### Indekseerimine
Pilditöötluses indekseeritakse kerneleid niimoodi, et indeksil h[0,0] oleks kerneli keskpunkt, selle tõttu on pilditöötluses kerneli negatiivsed indeksid normiks.
## Implementeerimine
Rakendades kernelit pildil viiakse läbi korrutiste summeerimise operatsioon originaalpildi ja kerneli peal. Kernel on massiiv, mille suurus määrab ära operatsiooni toimimise piirkonna ning kerneli elementide osakaalud määravad, kuidas mõjutab kernel väljundpilti. Kõigepealt keeratakse kernelit 180 kraadi ning seejärel üle originaalpildi libistades korrutatakse kõik originaalpildi väärtused läbi kohakuti oleva kerneli väärtustega ning summeeritakse maatriks, saades efektiivselt kerneli keskpunktiga kohakuti olnud iga originaalpildi punkti kohta väljundis vastava filtreeritud väärtuse. Tuleb tähele panna, et kerneli keskpunkt on protsessi käigus kohakuti originaalpildi piksliga, kuna enamustes pilditöötluse rakendustes tahame, et kernel mõjutaks pikslit sümmeetriliselt tema ümbruskonnas. Sümmeetrilise kerneli puhul ei muuda 180 kraadi keeramine tegelikult tulemust, kuid ebasümmeetrilise kerneli puhul on see vajalik – muidu poleks tegemist konvolutsiooniga, vaid ristkorrelatsiooniga.

### Kernel pildi servades
Kuna kerneli keskpunkt on alati kohakuti originaalpildi punktiga, siis on vaja, et ka originaalpildi piiridest väljaspool olevatel pikslitel oleks väärtused. Selleks on olemas mitmeid meetodeid.
#### Laiendamine
Kõige äärmiste pikslite väärtusi kopeeritakse väljapoole serva nii palju, et oleks kattuvus kerneliga.
#### Voltimine
Pilt volditakse ning väärtused võetakse vastasäärest või -nurgast.
#### Peegeldus
Pildi äärtes kasutatakse peegeldust. Näiteks antakse servast 3 ühiku kaugusele olevale pikslile väärtus, mis asub pildi sees kaugusel 3 ühikut servast.
#### Kerneli suuruse vähendamine
Ühtegi kerneli pikslit, mis jääb originaalpildi servadest väljapoole, ei kasutata – kompenseerimiseks kasutatakse normaliseerimist.
#### Konstantne väärtus
Originaalpildi mõõtmeid suurendatakse, näiteks luuakse pildi ümbrusse regioon, mille piksli väärtusteks antakse näiteks nullid.
#### Ülekattuvuse vältimine
Kernelit libistatakse originaalpildil niimoodi, et see ei läheks kunagi üle originaalpildi servade.

## Kernelite tüübid
### Silumis (ühtlustamis) kernelid
Kasutatakse, et vähendada järske üleminekuid intensiivsuses. Kuna juhuslik müra koosneb enamasti järskudest üleminekutest intensiivsuses, siis oleks mürasummutus loogiline lahendus ühtlustamiseks. Konvoleerides ühtlustamiskernelit pildiga, saame tulemuseks udustatud pildi, mille udustamise ulatus sõltub kerneli suurusest ja tema kaaludest. Nimetatakse ka madalpääsufiltriteks.
#### Kasti tüüpi kernel (''box kernel'')
Kõige lihtsam udustamise kernel – tema kaalud on kõik tüüpiliselt võrdsed ühega. *m x n* mõõtudega kernel on maatriks ühtedest, mille ees kasutatakse korrutisena normaliseerimise konstanti. Normaliseerimist tehakse kõigi madalpääsu kernelite puhul kahel põhjusel: 
* et pildiala konstantse intensiivsuse keskväärtus võrduks filtreeritava pildi intensiivsusega
* et pikslite summa jääks samaks nii originaalpildis kui filtreeritud pildis 
#### Gaussi kernel
Isotroopiline kernel – filtreerimise väljund ei sõltu originaalpildi orientatsioonist. Gaussi kernelitega on hea teha konvolutsiooni, samuti nagu kastkernelitega, kuid omavad veel lisaks ka muid häid omadusi. Näiteks kahe Gaussi kerneli konvolutsiooni ning korrutise tulemusena saame samuti Gaussi kerneli. Gaussi kerneli keskväärtus on null ning standardhälve üks.
### Teravustamise kernelid
Nimetatakse ka kõrgpääsufiltriteks. Teravustamine võimendab muutusi intensiivsuses ning saavutatakse ruumilise diferentseerimise teel. Pildi diferentseerimine võimendab servi ja suurendab müra ning võtab ära rõhku pildi aladelt, kus toimub intensiivsuse madal muutus. Kuna tegemist on digitaalse filtriga (digitaalsetel hulkadel lõplikud väärtused), siis on maksimaalne võimalik intensiivsuse muutus lõplik ehk lõpmatuseni pole võimalik teravustada.
#### 1. järgu tuletise kernelid
Sobilikud servade tuvastamiseks, kuna servad piltidel on tihtipeale hästi järsud muutused kõrvuti asuvate pikslite intensiivsuses.
* Sobeli kernel – leiab veergude ja ridade kaupa järsud muutused intensiivsuses
#### 2. järgu tuletise kernelid
Sobilikud piltide teravustamiseks. Võimendab peenemaid detaile pildil.
* Laplaciani kernel – tulemuseks peenemad detailid. Et saada teravustatud pilti, liidetakse Laplaciani filtri tulemus originaalpildile.

## Viited