OpenCV Threshold ( Python , C++ )
On 4 tammikuun, 2022 by adminMitä on kuvan kynnystäminen?
Katsele huolellisesti alla olevaa animaatiota (kuva 1). Kuinka monta numeroa näet? Suurin osa teistä näkee numeroita: 32 (ai niin, katso tarkkaan), 64, 100, 128, 180, 200 ja 255. Kuvassa on kuitenkin muutakin kuin mitä silmä näkee.
Sekunnissa näet alkuperäisen kuvan kynnysarvotetun version. Huomaat, että kaikki numerot näyttävät täysin valkoisilta ( eli niiden harmaasävyarvo on 255 ) ja niissä on ylimääräinen numero 5. Et huomannut numeroa 5 alkuperäisessä kuvassa, koska sen harmaasävyarvo oli, no, 5. Itse asiassa kaikilla alkuperäisen kuvan numeroilla on sama harmaasävyarvo kuin numerolla 5. Näin ollen 255 on kirkkain ja 5 on tummin.
Numeroiden lukeminen kynnyskorjatusta kuvasta on paljon helpompaa kuin numeroiden lukeminen alkuperäisestä kuvasta. Ei ole yllättävää, että tekstintunnistusalgoritmi pitää esimerkkimme kynnystettyä kuvaa paljon helpompana käsitellä kuin alkuperäistä kuvaa.
Tietokonenäköalalla kun teet tehtävästä helpomman ihmisille, teet siitä yleensä helpomman myös tietokonealgoritmeille.
Kaikki kynnysalgoritmit ottavat syötteenä lähdekuvan (src) ja kynnysarvon (thresh) ja tuottavat lähtökuvan (dst) vertaamalla lähdepikselin ( x , y ) pikseliarvoa kynnysarvoon. Jos src ( x , y ) > thresh , dst ( x , y ) saa jonkin arvon. Muussa tapauksessa dst ( x , y ) saa jonkin muun arvon.
Yksinkertaisinta kynnysarvon määritystä kutsutaan binääriseksi kynnysarvoksi. Se ottaa lähdekuvan (src) ja kynnysarvon (thresh) lisäksi toisen syöttöparametrin nimeltä maksimiarvo ( maxValue ). Jokaisessa pikselipaikassa (x,y) se vertaa pikselin arvoa src ( x , y ) threshiin. Jos src ( x , y ) on suurempi kuin thres, se asettaa kohdekuvan pikselin dst ( x , y ) arvoksi maxValue. Muussa tapauksessa se asettaa sen arvoksi nolla. Pseudokoodi näyttää seuraavalta.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Yleisesti ottaen on olemassa monenlaisia kynnystysmenetelmiä, jotka perustuvat erilaisiin kynnyssääntöihin, joita sovelletaan src ( x , y ) -kuvaan dst ( x , y ) saamiseksi. Katsotaanpa erilaisia OpenCV:ssä käytettävissä olevia kynnystyyppejä.
Kynnys Esimerkkejä: C++ ja Python
Jos sinulla on kiire, hyppää latausosioon saadaksesi koodin ja esimerkkikuvan.
Syöttökuva
Seuraavissa esimerkeissä käytämme tätä kuvaa syötteenä. Lataa kuva PNG-muodossa klikkaamalla kuvaa 2. Syöttökuvassa on numeroita, jotka on kirjoitettu intensiteetillä ( harmaasävyarvo ), joka on yhtä suuri kuin itse numero. Esimerkiksi luvun 200 pikseliarvo on 200 ja luvun 32 arvo on 32. Siksi 32 näkyy kuvassa paljon tummempana kuin 200.
Kussakin esimerkissä selitämme kynnystyssäännön pseudokoodin avulla, annamme C++- ja python-esimerkin sekä kynnystetyn tulostekuvan.
Binäärinen kynnyskorjaus ( type = THRESH_BINARY )
Tämä on yleisin ja yksinkertaisin kynnyskorjaustyyppi.
Kynnysarvosääntö
# 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);
Binary Thresholdin tulos
Kuvassa 3 on esitetty tulos, joka saadaan soveltamalla binääristä kynnysarvosäätöä sisääntulokuvaan, jossa thresh = 0 ja maxValue = 255.
Muuttamalla thresh arvoksi 127 poistetaan kaikki luvut, jotka ovat pienempiä tai yhtä suuria kuin 127.
Muuttamalla maxValue arvoksi 128 asetetaan kynnysalueiden arvoksi 128.
Käänteinen binäärinen kynnysarvo ( type = THRESH_BINARY_INV )
Käänteinen binäärinen kynnysarvo on juuri binäärisen kynnysarvon vastakohta. Kohdepikseli asetetaan nollaksi, jos vastaava lähdepikseli on suurempi kuin kynnysarvo, ja maxValueeksi, jos lähdepikseli on pienempi kuin kynnysarvo.
Trunssi-kynnys ( type = THRESH_TRUNC )
Tämässä kynnysarvotyypissä kohdepikseli asetetaan kynnysarvoon ( thresh ), jos lähdepikselin arvo on kynnysarvoa suurempi. Muussa tapauksessa se asetetaan lähdepikselin arvoon. maxValue jätetään huomiotta.
Kynnysarvosääntö
# 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);
Truncate Thresholding -menetelmän tulos
Kuvassa 7 on esitetty tulos, joka saadaan soveltamalla Truncate Thresholding -menetelmää tulokuvaan. Huomaa, että kaikki kynnysarvon ( 127 ) yläpuolella olevat arvot asetetaan arvoon 127 ja kaikki arvot, jotka ovat pienempiä tai yhtä suuria kuin 127, säilyvät ennallaan. maxValue jätetään huomiotta.
Threshold to Zero ( type = THRESH_TOZERO )
Tässä kynnystyksessä kohdepikselin arvo asetetaan vastaavaan lähdepikselin arvoon, jos lähdepikselin arvo on suurempi kuin kynnys. Muussa tapauksessa se asetetaan nollaksi. maxValue jätetään huomiotta.
Kynnysarvosääntö
# 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);
Tulos kynnysarvosta nollaan
Käänteinen kynnysarvo nollaan ( type = THRESH_TOZERO_INV)
Tässä kynnystyksessä kohdepikselin arvo asetetaan nollaan, jos lähdepikselin arvo on suurempi kuin kynnysarvo. Muussa tapauksessa se asetetaan lähdepikselin arvoon. maxValue jätetään huomiotta.
Kynnysarvosääntö
# 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);
Tulos Inverted Threshold to Zero -menetelmästä
Kuvassa 9 on esitetty tulos, joka saadaan soveltamalla Inverted Threshold to Zero -menetelmää sisääntulotiedostoon. Kynnysarvon alapuolella olevat numerot säilyttävät harmaasävyarvonsa, ja kynnysarvon yläpuolella olevat numerot ovat 0 rajaa lukuun ottamatta. Rajalla olevat artefaktit johtuvat siitä, että rajan pikseliarvot siirtyvät 0:sta numeron arvoon muutamassa pikselissä. Osa rajan pikseleistä on siis kynnysarvon alapuolella.
Vastaa