Skip navigation

Adaptív küszöbölés és vágás

OpenCV globális küszöbölés

A globális küszöböléssel már megismerkedtünk korábban, a pont-operációk tárgyalásánál. Mint láttuk, a globális küszöbérték használata nem elegendő, ha egyenetlen megvilágítású a képünk. Ilyen esetben az adaptív küszöblést használhatjuk.

OpenCV adaptív küszöbölő függvénye

Az adaptív, vagy más néven lokális műveletek küszöbérték paraméterét a vizsgált képpont egy lokális környezetének intenzitásértékei alapján határozzuk meg, vagyis ez képpontonként változó lehet. Az érték meghatározása után a művelet végrehajtása ugyanúgy megy, mint globális esetben: kritériumellenőrzés után módosítás, ha szükséges.

Az OpenCV cv2.adaptiveThreshold() függvényének használati módja:

result = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

result Az eredmény képmátrix.
src Bementi kép.
maxValue A kritériumnak megfelelő helyeken a képpont új intenzitásértéke, hasonlóan a globális küszöböléshez.
adaptiveMethod

ADAPTIVE_THRESH_MEAN_C vagy ADAPTIVE_THRESH_GAUSSIAN_C lehet.

Az első esetben a lokális küszöbérték a képpont környezetében található intenzitásértékek átlagaként számítódik ki. A második esetben a súlyozott összeget, ahol a súly értéke a vizsgált ponttól való távolság növekedésével csökken a Gauss függvénynek megfelelően.

thresholdType THRESH_BINARY vagy THRESH_BINARY_INV lehet, tehát csak küszöbölni tud!
blockSize A vizsgált képpont mekkora környezetét vegyük figyelembe a küszöbérték meghatározásakor (blockSize x blockSize). Páratlan legyen az értéke!
C A vizsgált területen található intenzitások (súlyozott) átlagából kivonjuk a C konstans értékét, mielőtt a küszöbértékkel összehasonlítanánk.

Sötétebb és világosabb lokális környezetek:

10_01_threshold_adaptive.py

import cv2

src = cv2.imread('screen01_h.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Source', src)

im_thresh = cv2.adaptiveThreshold(src, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 25, -30)
print('Adaptive threshold with 25x25 block size and -30 constant value.')
cv2.imshow('Result', im_thresh)
cv2.waitKey(0)

cv2.destroyAllWindows()

Eredménye

Megfigyelhető, hogy a sötétebb és világosabb területeken is elkülönülnek a betűk a gombokon.

25x25 méret és -30 konstans hívással az eredmény:

35x35 méret és -40 konstans esetén jobb eredményt kapunk:

Feladat

Egészítsük ki a programunkat úgy, hogy az adaptív küszöbölés paramétereit csúszkák segítségével tudjuk módosítani!