Skip navigation

Szürkeárnyalatos küszöbölés és vágás

Küszöbölés és vágás változatai

Képi adatok

Feltételezzük, hogy szürkeárnyalatos képen dolgozunk, ahol az intenzitásértékek [0, 255] közöttiek, vagyis nincsenek szín információk. Többcsatornás képek esetén átalakíthatjuk szürkeárnyalatosra, felbonthatjuk őket különálló csatornákra, vagy megfogalmazhatunk összetett, csatornák között definiált kritériumokat, ahogyan később vizsgálni fogjuk.

Műveletek

Minden képpontra egy kritériumot értékelünk ki, ez alapján dől el az eredmény intenzitásérték. A kritérium jellemzően egy vagy két küszöbértékkel való összehasonlítást jelent.

Küszöbölés

Eredménye egy bináris kép, vagyis az eredmény képpontjai 255 vagy 0 értékűek (igazából nullától különböző és 0), annak megfelelően, hogy a kritérium teljesült vagy sem.

Vágás

Szürkeárnyalatos eredmény: Eredeti intenzitás érték megtartása, ha a kritérium teljesül, egyébként módosítás (lehet 0, küszöbérték, maximális vagy más megadott érték).

Hatáskör

Globális

Minden képpontra egységes kritérium. A küszöb- és vágási értékek meghatározása sokféle lehet.

Lokális, vagy adaptív

A küszöbérték képpontonként változó, a lokális környezet intenzitásértékei alapján számítódik. Ezekkel később, a szegmentálás tárgyalásánál foglalkozunk!

Küszöbértékek meghatározása

A küszöbölés és a vágás műveletek a megfelelő küszöbérték megválasztásával használhatók.

A legegyszerűbb, ha ismert, ellenőrzött körülmények között készülnek a képek egy ismert és egyszerű színtérről. Ekkor előre meghatározott, konstans értékkel dolgozhatunk. Ilyen lehet egy egyenletesen megvilágított, a szállítószalagtól jól elkülönülő legyártott objektum, aminek az alakját vizuálisan ellenőrizni szeretnénk.

A küszöbérték beállítására interaktív lehetőséget is biztosíthatunk (például az OpenCV trackbar vezérlőjével), így vizuálisan ellenőrizhető a különböző küszöbértékek hatása, a megfelelő gyorsan kiválasztható.

Ha mindenképpen automatikus működésre van szükségünk, és konstans érték megadása nem lehetséges, algoritmikusan kell értéket adnunk. Egy ilyen lehetőség az Otsu-módszer, amely egy úgynevezett bimodális (kétcsúcsú) hisztogrammal rendelkező kép esetén (sötét háttéren világos objektumok vagy fordítva) az optimális kettéosztás helyét adja. Az OpenCV lehetőséget ad ilyen küszöbérték számításra, ahogyan a cv2.threshold() függvénynél látjuk majd. Az algoritmus működését a hisztogram fejezetben tárgyaljuk.

Egyenetlen megvilágítás esetén a globális módszerek nagyon korlátozottan használhatók, ilyen esetekben az adaptív küszöbölés és vágás jelenthet megoldást.

Globális küszöbölés és vágás megvalósítása Numpy műveletekkel

A pontoperációk egyszerűen elvégezhetők Numpy tömb manipulációkkal.

Az alábbi kódrészlet az src nevű képobjektum 120 értékkel történő bináris küszöbölését mutatja be. A küszöbölés eredményének új képmátrixot hozunk előzetesen létre. Mivel minden képpontnak értéket adunk, így nem szükséges az új képmátrix nullázása.

im_thresh = np.ndarray(src.shape, src.dtype)
im_thresh[src >= 120] = 255
im_thresh[src < 120] =
0

Küszöbölés könnyen végezhető két küszöbértékkel is. Példaként a [80, 160] tartományban küszöbölünk. Első lépésben 0-val töltjük fel az új eredmény képmátrixot. Ezután módosítjuk 255-re azokon a helyeken, ahol teljesül a kritérium.

im_thresh = np.ndarray(src.shape, src.dtype)
im_thresh.
fill(0)
im_thresh[(src >= 80) & (src <= 160)] = 255

A vágás hasonlóan oldható meg. Különbség, hogy ekkor célszerű másolatot készíteni az eredeti képről, így elegendő csak a kritériumnak nem megfelelő pontokban új értéket adni. A példában 0 érték szerepel, de itt olyat választhatunk, amire szükség van.

im_clip = src.copy()
im_clip[src < 80] = 0
im_clip[src > 160] = 0

A teljes megoldást a 04_05_a_np_threshold_clip.py példaprogram mutatja be.

Globális küszöbölés és vágás paraméterállítása csúszkával

A korábban már látott csúszka vezérlőelemmel gyorsan választhatunk megfelelő küszöbértékékeket és működési módot, ahogyan a 04_05_b_np_clip_tb.py példaprogramban láthatjuk is.

Beillesztjük a szükséges csomag definíciókat.

import cv2
import numpy as np

Globális változókban tároljuk a küszöbértékeket és a működési módot.

th_lower = 44
th_upper = 116
th_mode =
0

A th_clip() függvény fogja a th_mode változó által megadott műveletet végrehajtani (0: küszöbölés, 1: vágás) és az eredményt megjeleníteni. A global kulcsszóval tudjuk a függvényen belül a külső globális változókat elérni.

def th_clip():
global src, th_lower, th_upper, th_mode

im_th_clip = np.ndarray(src.shape, src.dtype)

if th_mode == 0:

  im_th_clip.fill(0)
im_th_clip[(src >= th_lower) & (src <= th_upper)] = 255

if th_mode == 1:

im_th_clip = src.copy()
im_th_clip[src < th_lower] = 0
im_th_clip[src > th_upper] = 0


cv2.imshow('Vagas', im_th_clip)

A csúszka kezelő függvények a kiválasztott paraméter értéket a megfelelő globális változókba helyezik, és meghívják a végrehajtó függvényt.

def trackbar_lower(th):
global th_lower

th_lower = th
th_clip()


def trackbar_upper(th):
global th_upper

th_upper = th
th_clip()


def trackbar_mode(x):
global th_mode

th_mode = x
th_clip()

A főprogram betölti és megjeleníti a képet, a kezdeti értékekkel megjeleníti az eredményt, és definiálja a három csúszka vezérlőt.

src = cv2.imread('car_numberplate_rs.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Eredeti', src)

th_clip()

cv2.createTrackbar('Also', 'Vagas', th_lower, 255, trackbar_lower)
cv2.createTrackbar('Felso', 'Vagas', th_upper, 255, trackbar_upper)
cv2.createTrackbar('Mukodes', 'Vagas', th_mode, 1, trackbar_mode)

A program lezárása a szokásos.

cv2.waitKey(0)
cv2.destroyAllWindows()

Nem egyenletes megvilágítás problémája

A screen_01_h.png bementi képen jól megfigyelhető az egyenetlen megvilágítás hatása a szürkeárnyalatos konverzió után. A valóságban megegyező színű objektumok (például a billentyűzet címkéi) a megvilágítás miatt erősen eltérő intenzitással jelennek meg, így globális küszöböléssel nem tudjuk szegmentálni őket.

Megjegyezzük, hogy ilyen egyenetlen megvilágítás esetén a szegmentáláshoz célszerűbb adaptív küszöbölést használni, amivel a szegmentálással foglalkozó fejezetben foglalkozunk részletesebben.

Globális küszöbölés 128 értékkel. A sötétebb területen jól elkülöníthetők a betűk és számok a billentyűzet gombjairól. A világosabb területen összefolynak az intenzitásértékek.