OpenCV Threshold ( Python , C++ )
On január 4, 2022 by adminMi a kép küszöbértékének meghatározása?
Nézze meg figyelmesen az alábbi animációt (1. ábra). Hány számot látsz? A legtöbben számokat fognak látni: 32 (ó igen, nézzétek meg figyelmesen), 64, 100, 128, 180, 200 és 255. De több van a képben, mint ami a szemnek látszik.
Egy másodperc múlva láthatjátok az eredeti kép küszöbértékkel csökkentett változatát. Észre fogod venni, hogy az összes szám teljesen fehérnek tűnik ( azaz 255-ös szürkeárnyalatú értékkel rendelkezik ), és van egy plusz 5-ös szám. Az 5-ös számot az eredeti képen nem vetted észre, mert a szürkeárnyalati értéke, nos, 5 volt. Valójában az eredeti képen az összes szám szürkeárnyalati értéke megegyezik a számmal. Ezért a 255 a legvilágosabb, az 5 pedig a legsötétebb.
A számok olvasása a küszöbözött képen sokkal könnyebb, mint az eredeti képen. Nem meglepő módon egy szövegfelismerő algoritmus a példánkban szereplő küszöbözött képet sokkal könnyebben feldolgozhatónak találja, mint az eredeti képet.
A számítógépes látásban, ha megkönnyítünk egy feladatot az emberek számára, akkor általában a számítógépes algoritmusok számára is megkönnyítjük azt.
Minden küszöbértékelő algoritmus bemenetként egy forrásképet (src) és egy küszöbértéket (thresh) vesz, és egy kimeneti képet (dst) állít elő a forráspixel ( x , y ) pixelértékének a küszöbértékkel való összehasonlításával. Ha src ( x , y ) > thresh , akkor a dst ( x , y ) valamilyen értéket kap. Ellenkező esetben a dst ( x , y ) valamilyen más értéket kap.
A küszöbölés legegyszerűbb formáját bináris küszöbölésnek nevezzük. A forráskép (src) és a küszöbérték (thresh) mellett egy másik bemeneti paramétert is elfogad, amelyet maximális értéknek ( maxValue ) neveznek. Minden egyes pixelhelyen (x,y) összehasonlítja az src ( x , y ) pixelértéket a thresh értékkel. Ha src ( x , y ) nagyobb, mint a thresh, akkor a célkép pixelének dst ( x , y ) értékét maxValue-ra állítja. Ellenkező esetben nullára állítja azt. Így néz ki az álkód.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Többnyire általánosságban a dst ( x , y ) megkapásához az src ( x , y ) képre alkalmazott különböző küszöbszabályokon alapuló küszöbértékek számos típusa létezik. Nézzük meg az OpenCV-ben elérhető különböző küszöbérték típusokat.
Küszöbérték példák: C++ és Python
Ha sietsz, ugorj a letöltés részhez, hogy megkapd a kódot és a példaképet.
Bemeneti kép
A következő példákban ezt a képet fogjuk használni bemenetként. Kattintson a 2. ábrára a kép PNG formátumban történő letöltéséhez. A bemeneti kép olyan számokat tartalmaz, amelyek intenzitása ( szürkeárnyalatos érték ) egyenlő magával a számmal. Például a 200-as szám pixelértéke 200, a 32-esé pedig 32. Ezért a 32 sokkal sötétebbnek tűnik a képen, mint a 200.
Minden példában pszeudokódon keresztül magyarázzuk el a küszöbölési szabályt, C++ és python példát adunk, valamint a küszöbölt kimeneti képet.
Bináris küszöbölés ( type = THRESH_BINARY )
Ez a leggyakoribb és legegyszerűbb küszöbtípus.
Küszöbölési szabály
# 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);
A bináris küszöbölés eredménye
A 3. ábra mutatja a bináris küszöbölés alkalmazásának eredményét a bemeneti képre thresh = 0 és maxValue = 255 értékkel.
A thresh 127-re történő módosítása minden 127-nél kisebb vagy azzal egyenlő számot eltávolít.
A maxValue 128-ra változtatása a küszöbértékkel érintett régiók értékét 128-ra állítja.
Inverz bináris küszöbértékelés ( type = THRESH_BINARY_INV )
A fordított bináris küszöbértékelés éppen a bináris küszöbértékelés ellentéte. A célpixelt nullára állítja, ha a megfelelő forráspixel nagyobb, mint a küszöbérték, és maxValue-ra, ha a forráspixel kisebb, mint a küszöbérték.
Küszöbölési szabály
# 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);
A fordított bináris küszöbölés eredménye
Megjegyezzük, hogy a 6. ábrán látható fordított bináris küszöbölés eredménye pontosan a 4. ábra fordítottja.
Truncate Thresholding ( type = THRESH_TRUNC )
A küszöbértékelés ezen típusánál a célpixel akkor kerül a küszöbértékre ( thresh ), ha a forráspixel értéke nagyobb a küszöbértéknél. Ellenkező esetben a forráspixel értékére kerül beállításra. maxValue figyelmen kívül marad.
Küszöbölési szabály
# 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);
A Truncate Thresholding eredménye
A 7. ábra mutatja a Truncate Thresholding alkalmazásának eredményét a bemeneti képre. Vegyük észre, hogy a küszöbérték ( 127 ) feletti összes értéket 127-re állítjuk, és minden 127-nél kisebb vagy azzal egyenlő értéket változatlanul hagyunk. maxValue-t figyelmen kívül hagyjuk.
Threshold to Zero ( type = THRESH_TOZERO )
Egy ilyen típusú küszöbértékelésnél a célpixel értéke a megfelelő forráspixel értékére kerül beállításra, ha a forráspixel értéke nagyobb, mint a küszöbérték. Ellenkező esetben nullára kerül beállításra. maxValue figyelmen kívül hagyásra kerül.
Küszöbértékelési szabály
# 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);
A küszöbérték nullára történő módosításának eredménye
Invertált Threshold to Zero ( type = THRESH_TOZERO_INV)
Egy ilyen típusú küszöbértékelésnél a célpixel értékét nullára állítjuk, ha a forráspixel értéke nagyobb, mint a küszöbérték. Ellenkező esetben a forráspixel értékére kerül beállításra. maxValue figyelmen kívül hagyásra kerül.
Küszöbszabály
# 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);
A nullára fordított küszöb eredmény
A 9. ábra mutatja a nullára fordított küszöb alkalmazásának eredményét a bemeneti képre. A küszöbérték alatti számok megtartják szürkeárnyalatos értéküket, a küszöbérték feletti számok pedig a határérték kivételével 0 értékűek. A határon lévő leleteket az okozza, hogy a határon lévő pixelértékek néhány pixel alatt 0-ról a szám értékére lépnek át. Így a határon lévő pixelek egy része a küszöbérték alatt van.
Kód és példakép letöltése
.
Vélemény, hozzászólás?