Skip navigation

Képpont típus konverziók

Képmátrix típusok

Szürkeárnyalatos képek esetén jellemzőn 8 bites, előjel nélküli egész szám reprezentációt használunk. Ez az uint8 Numpy típus.

Színes képeknél az egyes csatornák kerülnek uint8 értékekként tárolásra.

Előfordulhat, hogy egyes műveletek kivezetnek a [0, 255] értékkészletből, és nem megfelelő a (szaturált) eredménycsonkolás. Ekkor célszerű olyan adattípust használni, ami nagyobb értékkészletet biztosít, például 16 bites előjeles (int16) vagy előjel nélküli (uint16) egészet, vagy lebegőpontos (float32) számot. Az OpenCV típusoknál a 8, 16 és 32 számértékek a bitszélességet, az U az előjel nélküli, az S az előjeles, az F pedig a lebegőpontos típust jelenti a típus nevének megadásánál.

Többcsatornás (például színes) kép esetén a csatornák számát a Numpy tömb dimenzió megadásakor definiálhatjuk. OpenCV esetén a típus megnevezéséhez kell a C betűt (Channel rövidítése) és a csatornák számát számként hozzáírni. Például a CV_8UC3 a 3 csatornás, előjel nélküli 8 bites egész reprezentációjú képtípus lesz. Ha a csatornaszámot nem adjuk meg, akkor 1 az alapértelmezés.

Numpy OpenCV
uint8 cv2.CV_8U
uint16 cv2.CV_16U
int8 cv2.CV_8S
int16 cv2.CV_16S
float32 cv2.CV_32F

Fontos!

A képmátrixok megjelenítése szürkeárnyalatos esetben úgy alakul, hogy egész típus esetén az értékkészlet minimális értéke lesz a fekete, a maximális a fehér szín! Vagyis, ha 8 bitesről áttérünk 16 bites reprezentációra, a megjelenő kép gyakorlatilag teljesen sötét lesz, mert a [0, 255] csak egy szűk alsó részét tölti ki a 16 bites [0, 65535] értékkészletnek! Lebegőpontos képponttípus esetén a [0.0, 1.0] tartomány képződik le a fekete-fehér színekre. Fontos mindkét esetben a normalizálás!

Példa: minimum és maximum képpontértékek szerinti átalakítás 32 bites lebegőpontos típusba, [0.0, 1.0] tartományba.

norm_image = cv2.normalize(image, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

Feladat

Készítsünk programot, amely betölt egy színes fotót, nyerjük ki szürkeárnyalatos képként a kék csatornát, ezt alakítsuk át 32 bites lebegőpontos típusra! Jelenítsük meg, és írjunk ki egy képpont értéket a konzolra, hogy ellenőrizzük az átalakítást!