Skip navigation

Niblack küszöbölés

Működése

A Niblack algoritmus egy népszerű lokális küszöbölő/vágó eljárás. Egy lokális környezetben intenzitásérték statisztikát számolunk (átlag és szórás), és ez alapján határozzuk meg a lokális küszöböt: az átlagból kivonásra kerül a szórás k súllyal vett értéke.

niBlackThreshold() függvény az OpenCV contrib csomagjában található, vagyis nem része az alapcsomagnak! Ha használni szeretnénk, akkor az OpenCV contrib változatát telepítsük! A cv2 csomagon belül az ximgproc alcsomagnév megadása szükséges még. Használata hasonló a korábbi függvényekéhez:

dst = cv2.ximgproc.niBlackThreshold(src, maxVal, type, blockSize, k[, _dst[, binarizationMethod[, r]]])

A k paraméter a küszöbölés viselkedését befolyásolja. Javasolt értéke egy célszerűen [0, 1] közötti lebegőpontos szám, de más, akár negatív értékekkel is dolgozhatunk.

A módszer több változata is elterjedt, amelyek az átlag és szórás értékből más módon állítják elő a lokális küszöböt. Ezek közül a binarizationMethod opcionális paraméterrel választhatunk. Lehetséges értékek:

  • cv2.ximgproc.BINARIZATION_NIBLACK
  • cv2.ximgproc.BINARIZATION_SAUVOLA
  • cv2.ximgproc.BINARIZATION_WOLF
  • cv2.ximgproc.BINARIZATION_NICK

A Sauvola módszerhez egy plusz paraméter értéket is megadhatunk (r, alapértéke 128, a szórás érték dinamikus tartományát adja).

Dokumentáció:

10_02_threshold_niblack.py

# Megjegyzés: a Niblack függvény az OpenCV contrib csomagjában érhető el.
# Ha használni szeretnénk, ilyen OpenCV verziót telepítsünk!


import cv2


tb_k = 18
tb_k_max = 20
# Niblack k paraméter számítása: (tb_k - 10.0) / 10.0
# [-1.0, 1.0] közötti számot kapunk, 1 tizedesjegy pontossággal
# A kezdőérték így 0.8 lesz.

tb_blockSize = 18
tb_blockSize_max = 30
# Niblack blockSize paraméter számítása: 2 * tb_blockSize + 3
# Lehetséges értékek: 3, 5, 7, ..., 63
# A kezdőérték 39.

tb_type = 0
tb_type_max = 4
# 5 féle OpenCV küszöbölési típus a tb_types szerint.
# Kezdőértékként cv2.THRESH_BINARY.

tb_types = [cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV]

tb_type_strings = ['cv2.THRESH_BINARY', 'cv2.THRESH_BINARY_INV', 'cv2.THRESH_TRUNC', 'cv2.THRESH_TOZERO', 'cv2.THRESH_TOZERO_INV']

def refreshNiblackResult():
global dst

k = float((tb_k - 10) / 10)

blockSize = 3
if tb_blockSize > 1:

blockSize = 2 * tb_blockSize + 3

type = tb_types[tb_type]

print('Niblack parameters: blocksize={} k={} type={}'.format(blockSize, k, tb_type_strings[tb_type]))
dst = cv2.ximgproc.niBlackThreshold(src, 255, type, blockSize, k)
cv2.imshow('Niblack', dst)


def onNbTrackbar_k(trackPos):
global tb_k
tb_k = trackPos
refreshNiblackResult()


def onNbTrackbar_blockSize(trackPos):
global tb_blockSize
tb_blockSize = trackPos
refreshNiblackResult()


def onNbTrackbar_type(trackPos):
global tb_type
tb_type = trackPos
refreshNiblackResult()


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

cv2.createTrackbar('k', 'Niblack', tb_k, tb_k_max, onNbTrackbar_k)
cv2.createTrackbar('blockSize', 'Niblack', tb_blockSize, tb_blockSize_max, onNbTrackbar_blockSize)
cv2.createTrackbar('thresType', 'Niblack', tb_type, tb_type_max, onNbTrackbar_type)

refreshNiblackResult()

cv2.waitKey(0)
cv2.destroyAllWindows()

Eredménye

Trackbar és Niblack paraméterek

Nagyon fontos megjegyezni, hogy az OpenCV egyszerű trackbar vezérlőjével nem tudjuk a Niblack paramétereket közvetlenül beállítani! A k paraméternek ugyanis [-1, 1] közötti lebegőpontos számnak, a környezet méretének 3x3, 5x5, 7x7, ... értékűnek kellene lennie. A megszorítások miatt a trackbar [0, max] egész értékeiből kell kiszámolni a szükséges paramétereket. A jobb érthetőség kedvéért a program a konzolra kiírja, pontosan milyen paraméterekkel hívódik meg a niBlack függvény.

A fenti példában blocksize=39 és k=0.8 értékek számolódnak ki. A paraméter átalakító képletek a forráskódban olvashatók.

10_02_threshold_niblack_extended.py

A példaprogram bővített változata lehetővé teszi a lokális módszerek közötti választást, és a Sauvola módszer r paraméterének megadását is.