Skip to content

Archives

  • Leden 2022
  • Prosinec 2021
  • Listopad 2021
  • Říjen 2021
  • Září 2021

Categories

  • Žádné rubriky
Trend RepositoryArticles and guides
Articles

OpenCV Threshold ( Python , C++ )

On 4 ledna, 2022 by admin
  • Co je to prahování obrazu?
  • Příklady prahů: C++ a Python
  • Vstupní obrázek
  • Binární prahování ( typ = THRESH_BINARY )
  • Inverzní binární prahování ( typ = THRESH_BINARY_INV )
  • Truncate Thresholding ( type = THRESH_TRUNC )
  • Prah na nulu ( typ = THRESH_TOZERO )
  • Invertovaný Threshold to Zero ( typ = THRESH_TOZERO_INV)
  • Stáhněte si kód a ukázkový obrázek

Co 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.

Tento příspěvek byl testován na OpenCV 4.4.

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.

Obrázek 2: Vstupní obrázek. Kliknutím otevřete PNG s vysokým rozlišením v jiném okně

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í.

Obrázek 3 : Binární práh ( thresh = 0 a maxValue = 255)

Změnou hodnoty thresh na 127 se odstraní všechna čísla menší nebo rovna 127.

Obrázek 4 : Binární práh ( thresh = 127 a maxValue = 255)

Změnou maxValue na 128 se nastaví hodnota prahovaných oblastí na 128.

Obrázek 5: Binární práh s maxValue nastavenou 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.

Obrázek 6 : Inverzní binární prahování ( thresh = 127, maxValue = 0 )

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.

Obrázek 7 : Truncate thresholding (thresh = 127)

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

Obrázek 8. Jaký je výsledek prahování? Threshold to Zero ( thresh = 127 )

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.

Obrázek 9: Převrácený práh na nulu ( thresh = 127 )

Stáhněte si kód a ukázkový obrázek

.

Napsat komentář Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Archivy

  • Leden 2022
  • Prosinec 2021
  • Listopad 2021
  • Říjen 2021
  • Září 2021

Základní informace

  • Přihlásit se
  • Zdroj kanálů (příspěvky)
  • Kanál komentářů
  • Česká lokalizace
  • DeutschDeutsch
  • NederlandsNederlands
  • SvenskaSvenska
  • DanskDansk
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • RomânăRomână
  • PolskiPolski
  • ČeštinaČeština
  • MagyarMagyar
  • SuomiSuomi
  • 日本語日本語

Copyright Trend Repository 2022 | Theme by ThemeinProgress | Proudly powered by WordPress