Skip navigation

OpenCV threshold()

OpenCV threshold() függvénye

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.
A thresh_val akkor érdekes, ha a threshold() függvény határozza meg a küszöböt valamilyen algoritmussal (Otsu vagy triangle).
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őleg tárgyalt 5 érték egyikével 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 meghatá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

Az alábbi táblázat az első sorban szereplő vektor értékekre hajtja végre a cv2.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

04_06_c_threshold.py

import cv2
import numpy as np

src = cv2.imread('Sudoku_rs.jpg', 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()

04_06_d_threshold_trackbar.py

import cv2
import numpy as np


def onThresholdTrackbar(trackPos):
    print('Global threshold at intensity value {}.'.format(trackPos))
    threshold, im_thresh = cv2.threshold(src, trackPos, 255, cv2.THRESH_BINARY)
    cv2.imshow('Result', im_thresh)


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

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

cv2.createTrackbar('threshold', 'Result', int(otsuThreshold), 255, onThresholdTrackbar)
onThresholdTrackbar(otsuThreshold)
cv2.waitKey(0)

cv2.destroyAllWindows()