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)