Képfeldolgozási eljárások

Geometriai transzformációk

Alapvető transzformációk:

  • Eltolás
  • Skálázás
  • Forgatás

További transzformációk

Milyen további transzformációk vannak?

  • A mintavételezés miatt mindegyik művelet torzítással, információveszteséggel járhat.
  • A transzformáció elvégzése tulajdonképpen újra mintavételezést jelent.
  • Az eredeti képhez egy folytonos intenzitásfelületet kell számolni.
  • A probléma a nagyításra, mint a felbontás növelésére vezethető vissza.
  • A bilineáris interpoláció erre egy egyszerű lehetőséget ad.

Interpoláció

Milyen további transzformációk jöhetnek még szóba?

Super resolution

A super resolution is erre ad egy érdekes megoldást.

Forrás:

Hisztogramok számítása

  • Jól párhuzamosítható, mivel a lokális hisztogramok összeadhatók.

Konvolúciós szűrők

  • Átlagoló szűrő
  • Gauss szűrő
  • Medián szűrő

Kép objektumok kezelése

Képeket bufferekben is lehet tárolni, de célszerűbb az OpenCL kép objektumait használni.

  • Ezek a textúra memóriában kerülnek tárolásra, így gyorsabb elérést tesznek lehetővé.
  • Az indexelés természetesebben adódik.
  • A pixel formátumot maga az OpenCL adja. (A kép betöltését követően azzal már nem kell foglalkozni.)
  • 2D és 3D képeket is tudunk a segítségével kezelni.
cl_mem clCreateImage(
    cl_context context,
    cl_mem_flags flags,
    const cl_image_format *image_format,
    const cl_image_desc *image_desc,
    void *host_ptr,
    cl_int *errcode_ret
)

Az adatok írása és olvasása a bufferekhez hasonlóan működik:

Kernelben használható függvények:

Az OpenCV függvénykönyvtár

  • Képfeldolgozáshoz, gépi látáshoz kötődő alkalmazások számára készített függvénykönyvtár.
  • https://opencv.org/

Képfeldolgozáshoz kapcsolódó függvények:

Kérdések

  • Milyen kapcsolat van a Képfeldolgozás, Gépi látás és Gépi tanulás területek között?
  • Lehet-e olyan alkalmazást készíteni, amelyik egyidejűleg használ OpenCL-t, OpenCV-t és OpenGL-t?

Feladatok

1. Képadatok kezelése

  • Hozzunk létre egy RGB (vagy RGBA) pixel formátumú, \(256 \times 256\) méretű képtömböt!
  • Állítsuk be, hogy a vörös komponens értéke soronként növekedve \([0, 255]\) intervallumon változzon. Hasonlóképpen adjuk meg az oszlopokra is.
  • Küldjük át az adatokat a videókártyára, ahol egy kernel segítségével invertáljuk a színeket!
  • Másoljuk vissza a kép objektumot a host programba, és ellenőrízzük a kapott eredményt!

2. Transzformációs mátrix

  • Készítsünk egy programot, amely tetszőleges \(3 \times 3\) méretű transzformációs mátrix segítségével képes képeket transzformálni.
  • A mintavételezéshez használjuk a legközelebbi képpontnak a színét!
  • Figyeljünk arra, hogy a mintavételezési pont mindig az érvényes tartományon belül maradjon!
  • Oldjuk meg, hogy a tartományból kilépve \(x\) koordináta esetén a szélességgel, \(y\) koordináta esetén a magassággal számítunk maradékot!

3. Konvolúciós szűrők

  • Készítsünk egy konvolúciós szűrőt, amely kiemeli az élen a képeket! (Például Sobel vagy Roberts operátorral.)
  • Implementáljuk az eljárást szekvenciálisan és OpenCL segítségével!
  • Végezzünk méréseket ezek összehasonlítására különböző méretű képekkel!