OpenCV Threshold ( Python , C++ )
On 4 ledna, 2022 by adminCo je to prahování obrazu?
Pozorně sledujte animaci níže (obrázek 1). Kolik čísel vidíte? Většina z vás uvidí čísla: 32 (ano, podívejte se pozorně), 64, 100, 128, 180, 200 a 255. Ale na obrázku je toho víc, než se na první pohled zdá.
Za chvíli uvidíte prahovou verzi původního obrázku. Všimněte si, že všechna čísla vypadají zcela bílá ( tj. mají hodnotu ve stupních šedi 255 ) a navíc je zde číslo 5. V původním obrázku jste si čísla 5 nevšimli, protože jeho hodnota ve stupních šedi byla, no 5. Ve skutečnosti mají všechna čísla v původním obrázku hodnotu odstínu šedi rovnou tomuto číslu. Proto je 255 nejsvětlejší a 5 nejtmavší.
Čtení čísel v prahovaném obrázku je mnohem snazší než čtení čísel v původním obrázku. Není divu, že algoritmus pro rozpoznávání textu bude v našem příkladu prahově upravený obrázek zpracovávat mnohem snadněji než původní obrázek.
V počítačovém vidění, když nějakou úlohu usnadníte lidem, obvykle ji usnadníte i počítačovým algoritmům.
Všechny algoritmy prahování berou jako vstup zdrojový obrázek (src) a prahovou hodnotu (thresh) a porovnáním hodnoty pixelu ve zdrojovém pixelu ( x , y ) s prahovou hodnotou vytvářejí výstupní obrázek (dst). Pokud src ( x , y ) > thresh , pak se dst ( x , y ) přiřadí nějaká hodnota. V opačném případě je dst ( x , y ) přiřazena nějaká jiná hodnota.
Nejjednodušší forma prahování se nazývá binární prahování. Kromě zdrojového obrázku (src) a prahové hodnoty (thresh) přijímá další vstupní parametr nazvaný maximální hodnota ( maxValue ). V každém místě pixelu (x,y) porovnává hodnotu pixelu src ( x , y ) s hodnotou thresh. Pokud je src ( x , y ) větší než thresh, nastaví hodnotu pixelu cílového obrazu dst ( x , y ) na maxValue. V opačném případě ji nastaví na nulu. Zde je uvedeno, jak vypadá pseudokód.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Obecněji existuje mnoho typů prahování na základě různých prahových pravidel aplikovaných na src ( x , y ) pro získání dst ( x , y ). Podívejme se na různé typy prahů, které jsou v OpenCV k dispozici.
Příklady prahů: C++ a Python
Pokud spěcháte, přejděte do sekce ke stažení, kde získáte kód a ukázkový obrázek.
Vstupní obrázek
V následujících příkladech použijeme tento obrázek jako vstup. Kliknutím na obrázek 2 si stáhněte obrázek ve formátu PNG. Vstupní obrázek obsahuje čísla zapsaná s intenzitou ( hodnotou ve stupních šedi ) rovnou samotnému číslu. Např. hodnota pixelu čísla 200 je 200 a hodnota čísla 32 je 32. Proto se číslo 32 jeví v obrázku mnohem tmavší než číslo 200.
V každém příkladu vysvětlíme pravidlo prahování pomocí pseudokódu, uvedeme příklad v jazyce C++ a python a výstupní obrázek s prahovou hodnotou.
Binární prahování ( typ = THRESH_BINARY )
Jedná se o nejběžnější a nejjednodušší typ prahování.
Pravidlo pro prahování
# Binary Thresholdif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Python
# import opencvimport cv2# Read imagesrc = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)# Set threshold and maxValuethresh = 0maxValue = 255 # Basic threshold exampleth, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY);
C++
using namespace cv; // Read imageMat src = imread("threshold.png", IMREAD_GRAYSCALE);Mat dst;// Set threshold and maxValuedouble thresh = 0;double maxValue = 255; // Binary Thresholdthreshold(src,dst, thresh, maxValue, THRESH_BINARY);
Výsledek binárního prahování
Obrázek 3 ukazuje výsledek použití binárního prahování na vstupní obrázek s thresh = 0 a maxValue = 255. Na obrázku 3 je znázorněn výsledek binárního prahování.
Změnou hodnoty thresh na 127 se odstraní všechna čísla menší nebo rovna 127.
Změnou maxValue na 128 se nastaví hodnota prahovaných oblastí na 128.
Inverzní binární prahování ( typ = THRESH_BINARY_INV )
Inverzní binární prahování je právě opakem binárního prahování. Cílový pixel je nastaven na nulu, pokud je odpovídající zdrojový pixel větší než práh, a na maxValue, pokud je zdrojový pixel menší než práh.
Pravidlo prahování
# Inverse Binary Thresholdif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = maxValue
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY_INV)
C++
threshold(src,dst, thresh, maxValue, THRESH_BINARY_INV);
Výsledek inverzního binárního prahování
Všimněte si, že výsledek inverzního binárního prahování zobrazený na obrázku 6 je přesně obrácený výsledek obrázku 4.
Truncate Thresholding ( type = THRESH_TRUNC )
V tomto typu prahování je cílový pixel nastaven na prahovou hodnotu ( thresh ), pokud je hodnota zdrojového pixelu větší než prahová hodnota. V opačném případě je nastaven na hodnotu zdrojového pixelu. maxValue se ignoruje.
Prahové pravidlo
# Truncate Thresholdif src(x,y) > thresh dst(x,y) = threshelse dst(x,y) = src(x,y)
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TRUNC)
C++
threshold(src,dst, thresh, maxValue, THRESH_TRUNC);
Výsledek Truncate Thresholding
Obrázek 7 ukazuje výsledek použití Truncate Thresholding na vstupní obraz. Všimněte si, že všechny hodnoty nad prahovou hodnotou ( 127 ) jsou nastaveny na 127 a všechny hodnoty menší nebo rovné 127 jsou beze změny. maxValue je ignorována.
Prah na nulu ( typ = THRESH_TOZERO )
Při tomto druhu prahování je hodnota cílového pixelu nastavena na odpovídající hodnotu zdrojového pixelu, pokud je hodnota zdrojového pixelu větší než práh. V opačném případě je nastavena na nulu. maxValue se ignoruje.
Pravidlo prahování
# Threshold to Zeroif src(x,y) > thresh dst(x,y) = src(x,y)else dst(x,y) = 0
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO)
C++
threshold(src,dst, thresh, maxValue, THRESH_TOZERO);
Výsledek prahování na nulu
Invertovaný Threshold to Zero ( typ = THRESH_TOZERO_INV)
V tomto druhu prahování je hodnota cílového pixelu nastavena na nulu, pokud je hodnota zdrojového pixelu větší než prahová hodnota. V opačném případě je nastavena na hodnotu zdrojového pixelu. maxValue se ignoruje.
Pravidlo prahování
# Inverted Threshold to Zeroif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = src(x,y)
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO_INV)
C++
threshold(src,dst, thresh, maxValue, THRESH_TOZERO_INV);
Výsledek použití invertovaného prahu na nulu
Obrázek 9 ukazuje výsledek použití invertovaného prahu na nulu na vstupní obrázek. Čísla pod prahem si zachovávají svou hodnotu ve stupních šedi a čísla nad prahem mají hodnotu 0 s výjimkou hranice. Artefakty na hranici jsou způsobeny tím, že hodnoty pixelů na hranici přecházejí z 0 na hodnotu čísla v průběhu několika pixelů. Některé pixely na hranici jsou tedy pod prahovou hodnotou.
Stáhněte si kód a ukázkový obrázek
.
Napsat komentář