Globális küszöbölés és vágás

OpenCV threshold() függvénye

Elrejtés

Az OpenCV-ben a globális küszöbölésre és vágásra a threshold() függvény használható. Használati módja:

thresh_val, result = cv2.threshold(src, thresh, maxval, thresh_type)

Paraméterezése rögzített, de nem minden esetben kerül felhasználásra minden érték!

Mint láthatjuk, csak 1 küszöbértékkel történő műveletet valósít meg!

thresh_val, result A visszatéréskor 2 elemből álló tuple objektumot kapunk. Az első az alkalmazott küszöb értéke, a második az eredmény kép.
src Forrás kép (szürkeárnyalatos).
thresh Alkalmazandó küszöbérték.
maxval Azon képpontok új értéke, amelyekre teljesül a küszöb kritérium.
thresh_type Küszöbölés/vágás típusa, lásd a következő táblázatot.

thresh_type értékek jelentése:

THRESH_BINARY Bináris küszöbölés. Azon értékek, amelyek nagyobbak a thresh küszöbnél, a maxval paraméter értékét kapják, a többi helyen 0 lesz.
THRESH_BINARY_INV Bináris küszöbölés, az előző fordítottja.
THRESH_TRUNC Vágás. A küszöbértéknél nagyobb intenzitások a küszöb értékét kapják, a kisebbek változatlanul megmaradnak.
A maxval paraméter nem játszik ekkor szerepet.
THRESH_TOZERO Vágás. A küszöbértéknél nem nagyobbak kinullázódnak. A magasabbak megmaradnak változatlanul.
THRESH_TOZERO_INV Az előző fordítottja.
THRESH_OTSU

Önmagában nem használjuk, az előző 5 értékkel kombinálhatjuk, például így: cv2.THRESH_BINARY + cv2.THRESH_OTSU.

Használatával a küszöbérték a kép hisztogramja alapján, automatikusan kerül maghatározásra az Otsu-algoritmussal. A thresh érték figyelmen kívül marad. A függvény a thresh_val értékben adja vissza a számított küszöbértéket.

A küszbölés/vágás a fenti 5 érték alapján történik.

THRESH_TRIANGLE

Használata megegyezik a THRESH_OTSU értékével. Egy másik módszerrel történik az automatikus küszöbérték meghatározás.

thresh_type példák

Elrejtés

Az alábbi táblázat az első sorban szereplő vektor értékekre hajtja végre a threshold() függvényt. A thresh paraméter 125, a maxval pedig 255 minden esetben.

0 50 100 125 150 200 250 Eredeti értékek
0 0 0 0 255 255 255 THRESH_BINARY
255 255 255 255 0 0 0 THRESH_BINARY_INV
0 50 100 125 125 125 125 THRESH_TRUNC
0 0 0 0 150 200 250 THRESH_TOZERO
0 50 100 125 0 0 0 THRESH_TOZERO_INV

Küszöbölés megvalósítása Numpy műveletekkel

Elrejtés

A pontoperációk elvégzésére nem szükséges az OpenCV függvény használata, közvetlenül a Numpy tömb manipulációjával is dolgozhatunk. Például az alábbi kódrészlet a 125 értékkel történő bináris küszöbölést mutatja be.

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

03_01_threshold.py

Elrejtés

import cv2
import numpy as np

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

print('Global threshold at intensity value 128.')
threshold, im_thresh = cv2.threshold(src, 128, 255, cv2.THRESH_BINARY)
cv2.imshow('Result', im_thresh)
cv2.waitKey(0)

threshold, im_thresh = cv2.threshold(src, -1, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
print('Detected Otsu threshold = {}'.format(threshold))
cv2.imshow('Result', im_thresh)
cv2.waitKey(0)

print('Global threshold at intensity value 128 using Numpy array operations.')
im_thresh = np.ndarray(src.shape, src.dtype)
im_thresh[src >= 128] = 255
im_thresh[src < 128] = 0
cv2.imshow('Result', im_thresh)

cv2.waitKey(0)

# print('Threshold with two values.')

cv2.destroyAllWindows()

Eredmények

Elrejtés

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.

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.

Az Otsu-algoritmus 95 küszöbértéket ad. A küszöbölés eredménye így: