Skip navigation

Hisztogram és kontraszt széthúzás

Hisztogram széthúzás

A hisztogram széthúzás a képmátrix normalizálásával egyezik meg, amit tárgyaltunk korábban a képmátrix típusok részben.

Az OpenCV normalize() függvénye segítségével a képen előforduló min-max értéktartományt egy általunk megadott értéktartományba alakíthatjuk lineárisan. Az alpha és beta paraméterek adják az új értékkészlet minimális és maximális elemét. Típuskonverzióra itt nincs szükség. Az alábbi példa egy szokásos, np.uint8 (cv2.CV_8U) típusú képen végez hisztogram széthúzást:

hist_norm = cv2.normalize(image, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

Kontraszt széthúzás

A kontraszt széthúzással a kép intenzitástartományának egy szűkebb részét tudjuk széthúzni a teljes tartományra. Ezzel egy szűkebb tartományt tudunk kiemelni, kontrasztosan megjeleníteni, a kívül eső rész eltüntetésével.

Annyiban más, mint az előző, hogy a min-max értékek nem a hisztogram min-max helyei szerint kerülnek meghatározásra. Megadhatjuk manuálisan, eltávolítandó százalékos darabszámmal, vagy kiszámíthatjuk tetszőleges más módon.

A következő példánkban egy szürkeárnyalatos kép esetén a [100, 140] közötti értékek kerülnek a [0, 255] tartományra. A széthúzást két küszöbparaméterrel adhatjuk meg. Az alsónál kisebb értékek 0, a felsőnél magasabbak 255 értéket kapnak.

Érdekes módon az OpenCV nem ad közvetlenül használható függvényt a feladatra, a hatást több függvény (threshold(), normalize()) összehangolt működésével érhetjük el, vagy végigfutva egyenként az intenzitásértékeken. A NumPy segítségével is hasonló, de szintaktikailag egyszerűbb a megoldás. A vegyes megoldás a legegyszerűbb: a megadott küszöbértékekkel vágást végzünk (részletek az előző fejezetben) az intenzitástartományon, majd normalizáljuk (részletek korábban) a képet.

th_lower = 100
th_upper = 140
img[img > th_upper] = th_upper
img[img < th_lower] = th_lower
hist_stretch = cv2.normalize(img, None, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)

Színes kép esetén végezhetünk színtér konverziót és a széthúzást csak az Y csatornán hajthatjuk végre, vagy minden csatornára külön is megtehetjük.

Példaprogramok

05_03_b_histStretch_gray_np.py példaprogram az előzőleg tárgyalt [100, 140][0, 255] kontraszt széthúzást hajtja végre a Sudoku_h.jpg képen.

05_03_c_histStretch_gray_np_tb.py interaktívvá teszi a programot, az alsó és a felső küszöbértéket csúszkák segítségével állíthatjuk. Az eredmény ennek hatására frissül, valamint az eredeti kép hisztogramján két vörös vonal mutatja a küszöbértékek helyeit. A köztes intenzitásértékek kerülnek széthúzásra a teljes tartományra. A kezdeti alsó és felső küszöb értékeket a képen előforduló minimális és maximális értékeknek megfelelően állítja be, vagyis hisztogram széthúzást végez, amit a csúszkákkal kontraszt széthúzássá alakíthatunk.

Window/Level (ablak/szint) állítás

Orvosi képek megjelenítésében nagyon gyakran használják a kontraszt széthúzást. Ezek a képek rendszerint intenzitásképek, vagyis egycsatornásak, nem szín információt hordoznak, és 12 vagy 16 bites előjeles egész reprezentációt használnak. A megjelenítéshez vissza kell skálázni a képet, vagy annak egy tartományát a [0, 255] skálára.

Érdekes módon ezen a területen a kontraszt széthúzásnak egy másik megadási módja a szokásos. A két szélső érték közvetlen megadása helyett az intenzitástartomány szélességét (Window – ablak) és középső elemét (Level – szint) adják meg.