Ohjelmointi ja numeeriset menetelmät, luento 13, 26.4.

Kuvankäsittelyä

Mittausten virheet

Useat virhelähteet vaikuttavat havaintoihin, kuten CCD-kuviin: Kuvankäsittelyn tarkoitus on korjata näitä vikoja. Siihen kuuluu mm.


Esitystavat

Kuva esitetään tavallisesti matriisina, jonka kukin alkio vastaa yhtä pikseliä. Toinen mahdollisuus olisi tallettaa esimerkiksi Fourier'n sarjan kertoimet. Molemmat ovat erikoistapauksia yleisestä kehitelmästä.

Olkoon f neliöllisesti integroituva funktio, joka on määritelty jossakin alueessa S. Haluamme esittää funktion kantafunktioiden \phimn, m,n=0,1, ..., avulla. Kantafunktiot ovat ortonormaaleja, jos

\int\intS \phimn(x,y) \phirs*(x,y) dx dy = \deltamr \deltans.

Haemme kehitelmää

\summ=0M-1\sumn=0N-1 amn \phimn(x,y)

siten, että virhe e2 (sampling error) on mahdollisimman pieni:

e2 = \int\intS | f(x,y) - \summ=0M-1 \sumn=0N-1 amn \phimn(x,y) |2 dx dy.

Tämä toteutuu, kun

amn = \int\intS f(x,y)\phimn*(x,y) dx dy.

Kantafunktioiden joukkoa sanotaan täydelliseksi, jos jokaiselle neliöllisesti integroituvalle funktiolle virhe e --> 0, kun termien määrä kasvaa.

Standardiesitys: Kantafunktiot ovat suorakaiteita:

\phimn(x,y) =
\sqrt(MN/AB), jos mA/M <= x <= (m+1)A/M ja nB/N <= y <= (n+1)B/N,
0 muuten.

Kerroin amn on yksinkertaisesti funktion f keskiarvo suorakaiteessa, jossa \phimn != 0.

Fourier'n esitys: Kantafunktiot ovat

\phimn(x,y) = (1/ \sqrt(AB)) e2i\pi (mx/A + ny/B),

missä A ja B ovat kuvan leveys ja korkeus.

Optimaalinen esitys: Onko olemassa kantaa, jossa virhe e2 on mahdollisimman pieni. Virheen minimointi johtaa ominaisarvotehtävään

\int\int Rff(x,x',y,y')\phim,n(x',y') dx' dy' = \gammamn\phimn(x,y),

jonka ratkaisuna saadaan optimaaliset kantafunktiot. Ne tunnetaan Karhusen ja Loeven funktioina.


Kvantisointi

Jatkuvat intensiteettiarvot täytyy muuntaa äärelliseksi määräksi harmaasävyjä. Olkoot eri sävyjen rajat zk, k=1,2, ..., K+1. Jos intensiteetti on välillä [zk, zk+1), pikseli saa arvon qk.

Jos p(z) on todennäköisyys, että intensiteetti on z, kvantisointivirhe on

\deltaq2 = \sumk=1K \intzkzk+1 (z-qk)2p(z) dz.

Minimoidaan tätä:

  \pd\deltaq2 / \pd zk =
    (zk-qk-1)2p(zk)-(zk-qk)2p(zk)=0, k=2,3, ..., K,
  \pd\deltaq2 / \pd qk =
     -2\intzkzk+1 (z-qk)p(z) dz = 0, k=1,2, ..., K.

eli

  zk =  qk-1+qk / 2,
  qk =  \intzkzk+1 zp(z) dz / \intzkzk+1p(z) dz.

Jos p(z) on vakio, saadaan tasaväliset rajat.

Käytännössä kvantisointi tapahtuu suoraan laitteistotasolla, jolloin rajat ovat yleensä tasavälisiä, vaikka se ei antaisikaan optimaalista lopputulosta.


Tiivistäminen

Tiivistämistä (compression) tarvitaan tilantarpeen vähentämiseksi ja myös tiedonsiirron nopeuttamiseksi.

Usein naapuripikselit ovat korreloituneita, joten tilaa hukataan tallettamalla tietoa, jonka informaatiosisältö on pieni.

Tiivistämistä voi tehdä monella tavalla:

Virheetön (tietoa hukkaamaton, kohinaton) menetelmä säilyttää kaiken alkuperäisen kuvan informaation, joten kuva on rekonstruoitavissa tarkasti alkuperäiseen muotoon.

Tietoa hukkaava (kohinainen) menetelmä säilyttää vain oleellisimmat piirteet; yleensä menetetään pienimmät yksityiskohdat.

Jos harmaatason qi todennäköisyys on pi, kuvaan sisältyvän informaation määrä on

H=-\sumi=1K pi log2 pi.

Tämä on alaraja sille, kuinka monta bittiä pikseliä kohti tarvitaan, jotta alkuperäinen kuva pystytään säilyttämään.

Transformaatiotiivistys: Esitetään kuva kantafunktioiden kombinaationa ja säilytetään vain merkittävimmät termit. Järkevien kantafunktioiden valinta edellyttää kuitenkin tietoa itse kuvasta.

Karhusen ja Loeven muunnos (KL-muunnos): Jos kuva esitetään KL-funktioiden kombinaationa, kertoimet ovat riippumattomia. Kantafunktioiden etsiminen on periaatteessa raskas ominaisarvotehtävä. Jos autokorrelaatiofunktio oletetaan tunnetuksi, voidaan kantafunktioille johtaa lausekkeet.

Fourier'n muunnos: Helppo laskea, mutta yleensä tarvitaan enemmän termejä kuin KL-muunnoksessa, jotta päästäisiin samaan kuvan laatuun.

Hadamardin muunnos: Hyvin tehokas muunnos, jonka kantamatriisit koostuvat pelkästään luvuista +1 ja -1 (ja normitusvakiosta).

N×N kuvalle, missä N on kakkosen potenssi kantamatriisit ovat

\phi(u,v)(m,n)= 1/N (-1)b(u,v,m,n),

missä

b(u,v,m,n) = \sumk=0log2N-1(bk(u)bk(v)+bk(m)bk(n)),

ja bk(x) on luvun x k:s bitti.

Jakson pituus -koodaus (Run length coding): Pikselit korvataan pareilla (v,n), missä v on pikselin arvo ja n on niiden peräkkäisten pikselien määrä, joilla on sama arvo. Säästää paljon tilaa, jos kuvassa on suuria tasaisia pintoja.

Huffman-koodaus: Usein esiintyvät arvot korvataan lyhyillä koodeilla ja harvinaiset pitemmillä.

Fraktaalikoodaus: Luonnossa esiintyvät kohteet ovat harvoin yksinkertaisia geometrisia objekteja, vaan niillä on itsesimilaarinen rakenne (yksityiskohta suurennettuna näyttää samantapaiselta kuin suurempi osa kohdetta). Fraktaalitiivistys perustuu iteroituihin funktiosysteemeihin (IFS, iterated function systems, ks. esim.\ Barnsley: Fractals everywhere, Academic Press 1988.). IFS on satunnaiskulku, jonka kussakin pisteessä valitaan satunnaisesti (mutta sopivilla painoilla) jokin mahdollisista muunnoksista seuraavan pisteen laskemiseksi. Laskennallisesti erittäin raskas, mutta voi tiivistää mutkikkaan metsää, kukkia tai pilviä esittävän kuvaan muutamaan tuhanteen tavuun.

  program ifs
  !  Plot attractor of an iterative process
  !   | x |   | a  b || x |   | e |
  !   |   | = |      ||   | + |   |
  !   | y |   | c  d || y |   | f |
  ! There are maxn different sets for the coefficients 
  ! p(i) is the probability that set i will be used 
  ! sp is the cumulative probability distribution
    use plot
    implicit none
    integer, parameter:: maxn=4, npoints=30000
    real, dimension(maxn) :: a,b,c,d,e,f,p
    real, dimension(0:maxn) :: sp
    real, dimension(npoints) :: xx, yy
    integer i

    a = (/ 0.00,  0.85,  0.20, -0.15 /)
    b = (/ 0.00,  0.04, -0.26,  0.28 /)
    c = (/ 0.00, -0.04,  0.23,  0.26 /)
    d = (/ 0.16,  0.85,  0.22,  0.24 /)
    e = (/ 0.00,  0.00,  0.00,  0.00 /)
    f = (/ 0.00,  1.60,  1.60,  0.44 /)
    p = (/ 0.01,  0.85,  0.07,  0.07 /)
    sp = 0.0
    do i=1, maxn
       sp(i) = sp(i-1)+p(i)
    end do
    sp(maxn) = 1.01
    call iterate2(xx, yy, npoints)
    call init("xx.ps", 5.0, 5.0, 40.0, 40.0)
    call plotpoints(xx, yy, npoints)
    call finish()
  contains
  subroutine iterate2(xx, yy, npoints) 
  ! random iteration algorithm
    integer, intent(in) :: npoints
    real, dimension(npoints) :: xx, yy
    integer i, k
    realx, y, xprev, yprev, r
    xprev=0.0 ; yprev=0.0
    do i=1,npoints
       call randomnumber(r)
       do k=1,maxn  
          if (r < sp(k)) exit
       end do
       x=a(k)*xprev+b(k)*yprev+e(k)
       y=c(k)*xprev+d(k)*yprev+f(k)
       xx(i) = x ; yy(i) = y
       xprev=x ; yprev=y ;
    end do
  end subroutine
  end program


Kuvaformaatteja

fits (flexible image transport system) Tähtitieteessä yleinen datan esitystapa. Kuvat pakkaamattomia pikselikuvia. Vanhanaikainen, suunniteltu alunperin magneettihaunoille tallennusta varten. Lisätietoa osoitteesta http://heasarc.gsfc.nasa.gov/docs/heasarc/fits.html

eps (Encapsulated PostScript) Tekstiä, oikeastaan ohjelmointikieli, helppo siirtää. Sopii hyvin vektorigrafiikkaan, huonommin pikselikuviin. Kielen kehittyneiden rakenteiden avulla monimutkaisiakin kuvia voi toteuttaa hyvin lyhyesti. Esitystapa on riippumaton tulostuslaitteen resoluutiosta. Kuvan rasterointi on tulostimen tehtävä. Adoben lisenssi nostaa PS-tulostimien hintaa.

tif (Tagged Image format) Pikselikuva, ei pakattu, tiedostot isoja.

gif (CompuServe graphics interchange format) Pakattu kuva, ei hukaa informaatiota.

jpeg (Joint Photographic Experts Group file interchange format) Informaatiota hukkaava pakattu kuva. Tarkkuus kärsii hieman, mutta tilansäästö huomattava.

mpeg (Motion Picture Experts Group file interchange format) Liikkuvan kuvan pakkausmenetelmä. Tietyn pikselin väri ei yleensä muutu kahden kuvan välillä, joten koko kuvan sijasta talletetaan vain niissä tapahtuvat muutokset.

pdf (Portable Document Format) Lähinnä julkaisualan uusi standardi. Tiedosto ASCII-tekstiä, joten helposti siirrettävissä.

Linuxin convert muuntaa ainakin noin 75 eri kuvaformaattia toisikseen.

       66146 Apr 15 13:40 forest.bmp ==>
      524554 Apr 15 13:42 forest.tif
      218378 Apr 15 13:41 forest.eps
       75115 Apr 15 13:40 forest.gif
       24881 Apr 15 13:43 forest.jpg

         826 Dec 17  1997 color.ps ==>
     2908547 Apr 15 13:59 color.tif
     1454166 Apr 15 14:00 color.bmp
      551223 Apr 15 14:01 color.gif
      137581 Apr 15 14:17 color.eps
       47422 Apr 15 13:59 color.jpg


Geometriset muunnokset

Geometrinen muunnos kuvaa pisteen (x,y) toiselle pisteelle (x',y'). Tietokonegrafiikassa on käytännöllistä esittää pisteitä sarakevektoreilla, joissa on yksi ylimääräinen alkio. Tason piste (x,y) esitetään muodossa

     | x |
  x= | y |
     | 1 |

Muunnokset voidaan silloin esittää 3×3-matriiseina:

  | x' |     | x |
  | y' | = M | y |
  | 1  |     | 1 |

  1. translaatio

          | 1   0   tx |
      M = | 0   1   ty |
          | 0   0   1  |
    
    
  2. skaalaus

          | sx  0   0 |
      M = | 0   sy  0 |
          | 0   0   1 |
    
    
  3. kierto

          |  cos f  sin f   0 |
      M = | -sin f  cos f   0 |
          |  0      0       1 |
    
    
Näitä voi käyttää viivapiirroksille, mutta EI pikselikuville.

Pikselikuvien geometriset muunnokset

1) Suora muunnos:

x --> M x = x'.

Ei käy, sillä

2) Käänteinen muunnos: kullekin (x', y') etsitään pikseli (x,y), joka kuvautuu pisteeseen (x',y') ja annetaan sen arvo pikselille (x',y'). Parempi, ei jätä tyhjiä pikseleitä. Edelleen jotkut alkuperäisen kuvan pikselit voivat kuvautua useammalle pikselille, jotkin eivät millekään.

3) Käänteinen interpolaatio: haetaan (x,y) kuten edellä; x eivät y yleensä ole kokonaislukuja, joten interpoloidaan pistettä (x,y) vastaava pikselin arvo. Toimii yleensä hyvin, varsinkin jos kuva on kohtuullisen jatkuva. Terävät reunat voivat muuttua epätarkoiksi.

4) Uudelleen konstruointi: esitetään alkuperäinen kuva funktiona, jonka avulla lasketaan uudet pikselien arvot. Työlästä, mutta antaa parhaan tuloksen.


Suotimet (filtterit), kohinan vähentäminen

Suodin on tavallisesti lokaali muunnos

f(x,y) --> f'(x,y)=\intS f(x-x',y-y') g(x',y') dx' dy',

missä S is pieni origin ympäristö. Monet suotimet ovat konvoluutiomuotoa, jolloin voidaan käsitellä joko alkuperäistä kuvaa tai sen Fourier'n muunnosta.

Ei-rekursiivinen suodin: kaikki uudet arvot lasketaan pelkästään alkuperäisen kuvan avulla.

Rekursiivinen suodin: korvataan kukin pikseli uudella arvolla heti kun se on laskettu; muunnettu kuva voidaan tallettaa alkuperäisen päälle.

Alipäästösuodin: poistetaan tiettyä rajaa korkeammat taajuudet. Helpoin toteuttaa Fourier'n muunnoksen avulla. Suotimella on tasoittava vaikutus. Koska rect-funktion Fourier'n muunnos on sinc-funktio, alkuperäisen kuvan tasoitus (konvoluutio rect-funktion kansa) ei poista korkeita taajuuksia kokonaan.

Alipäästösuotimia:

      | 1  1  1 |
 1/9  | 1  1  1 |
      | 1  1  1 |

      | 0  1  0 |       
 1/5  | 1  1  1 |
      | 0  1  0 |

      | 0  1  0 |       
 1/6  | 1  2  1 |
      | 0  1  0 |


Alipäästösuodatus alkuperäiselle signaalille ei poista kaikkia korkeita taajuuksia.


Alipäästösuodatus signaalin Fourier'n muunnokselle.


Ylipäästösuodin: poistetaan matalat taajuudet. Kuvaa terävöittävä vaikutus. Vastaa derivointia.

Esim. Laplacen operaattori on ylipäästösuodin

\nabla2f(i,j) = \Deltax2f(i,j)+\Deltay2f(i,j)
=(f(i+1,j)+f(i-1,j)+f(i,j+1)+f(i,j-1))-4f(i,j).

eli

   | 0   1   0 | 
   | 1  -4   1 |
   | 0   1   0 |

Mediaanisuodin: Keskiarvo pienentää piikkejä (kuten kosmisia säteitä), mutta ei poista niitä, vaan levittää niiden energian laajemmalle alueelle. Parempi ratkaisu on korvata pikseli pienen ympäristön mediaanilla. Tämä ei sumenna reunoja eikä vaikuta monotonisesti muuttuviin alueisiin.


Signaali ja mediaanisuotimella suodatettu signaali.


Dekonvoluutio

Oletetaan, että psf h on translaatioinvariantti. Havaitun kuvan p ja alkuperäisen kuvan f välillä pätee silloin

p(x,y)=\int\int h(x-x', y-y')f(x',y') dx' dy' + \nu(x,y),

missä \nu on kohina. Laskemalla kummankin puolen Fourier'n muunnos saadaan

P(u,v)=H(u,v)F(u,v)+N(u,v),

missä H on kuvanmuodostusjärjestelmän siirtofunktio (transfer function).

Alkuperäinen kuva voidaan yrittää palauttaa

F(u,v)= M(u,v) (P(u,v)-N(u,v)),

missä suodin M on (luento ??)

M(u,v) =
1/H(u,v), jos u2+v2 <= r2zbr> 1, muuten.


Alkuperäinen ja PSF:llä dekonvoloitu kuva.


Maksimientropiamenetelmä

Toinen menetelmä perustuu entropian käsitteeseen

Hf=-\summ\sumn f(m,n) \ln f(m,n).

Jos kokonaisenergia

f\rm tot = \summ\sumn f(m,n)

pysyy vakiona, entropia on sitä pienempi, mitä enemmän arvot f(m,n) vaihtelevat.

Kohina voi saada myös negatiivisia arvoja. Lisätään kohinaan vakio C siten, että \nu(m,n)+C on aina positiivinen:

H\nu = -\summ\sumn (\nu(m,n)+C) ln(\nu(m,n)+C),

Maksimientropiakorjaus tehdään maksimoimalla lauseketta

H=Hf + a H\nu,

missä a on tasoituksen määrää kuvaava vakio. Lisäksi tarvitaan kaksi rajoitusta:

1) Kokonaisenergian ftot täytyy säilyä vakiona.

2) Havaitun kuvan p täytyy olla alkuperäisen kuvan f ja psf:n h konvoluutio + kohina:

p(q,r)=\summ\sumn h(q-m,r-n) f(m,n) + \nu(m,n).

Ratkaisuna saadaan f ja \nu.


Kuvan terävöittäminen

Ajatellaan, että kuvaa on sumennettu lisäämällä kuhunkin pikseliin osa $\epsilon$ naapuripikselien summasta:

p(i,j)=f(i,j)+\epsilon n(i,j),

missä

n(i,j)=f(i+1,j)+f(i-1,j)+f(i,j+1)+f(i,j-1).

Vähennetään Laplace-operaattoriin verrannollinen lauseke:

  p(i,j) - k\nabla2 p(i,j)
  = (1+4k) p - k (p(i+1,j)+p(i-1,j)+p(i,j+1)+p(i,j-1))
  = (1+4k)f(i,j) + (1+4k)\epsilon n(i,j)-kn(i,j)
    -k \epsilon (n(i+1,j)+n(i-1,j)+n(i,j+1)+n(i,j-1)).

Jos k ja \epsilon ovat pieniä, viimeinen termi voidaan unohtaa. Jos k=\epsilon/(1-4\epsilon), kaksi muuta termiä katoaa, jolloin

p(i,j)- k\nabla2p(i,j) = (1+4k)f(i,j),

joten alkuperäinen kuva on rekonstruoitu vakiokerrointa vaille.


Vas. ylh.: Dekonvoloitu kuva.
Oik. ylh.: Kuva tasoitettu yhdeksän pisteen painotetun keskiarvon avulla.
Vas. alh.: Laplace-suodatettu kuva.
Oik. alh.: Alkuperäisestä kuvasta on vähennetty Laplace-suodatettu kuva.


Numeriikan kirjastoja

+ Säästää aikaa, hikeä ja kyyneleitä

+ Aliohjelmat testattuja ja luotettavia

+ Tehokkuus optimoitu

- Ei aina sovellu kovin hyvin omaan tehtävään

- Kaupallisista kirjastoista ei saa lähdekoodia, ei voi muuttaa eikä siirtää erilaiseen ympäristöön

BLAS, Lapack ilmaisia, lähdekoodi vapaasti saatavissa ja levitettävissä.

Nag, IMSL kaupallisia, saatavana useisiin eri ympäristöihin. Melko kalliita, yleensä vuosittainen lisenssimaksu.

Suurten tietokoneiden valmistajilla usein omille laitteille viritettyjä kirjastoja.

Netlib sisältää runsaasti eri alojen ilmaisia kirjastoja.

CSC:n koneilla käytettävissä suuri määrä eri alojen kirjastoja ja ohjelmia. Verkkosivuilta löytyy lisää linkkejä.


Ilmaisia kirjastoja

BLAS (Basic lineara algebra subprograms)

Yksinkertaisia vektori- ja matriisioperaatioita:

Lapack

Rutiinit reaali- ja kompleksiarvoisille matriiseille.


Kaupallisia kirjastoja

IMSL

Ainakin tuhatkunta rutiinia.

Nag

Vielä laajempi kuin IMSL.

Kirjaston mukana esimerkkiohjelma jokaisen aliohjelman käytöstä.