- 1. Segmentointi ja muodot
- 2. Hierarkia ja hakutila
- 3. Muotojen lähentäminen ja niiden kuperan rungon löytäminen
- 4. Kupera runko
- 5. Muotojen sovittaminen muotojen mukaan
- 6. Tunnistettavat muodot (ympyrä, suorakulmio, kolmio, neliö, tähti)
- 7. Linjan tunnistus
- 8. Blob-tunnistus
- 9. Blobien suodattaminen - ympyröiden ja ellipsien laskeminen
Aikaisemmissa opetusohjelmissa olemme käyttäneet OpenCV: tä kuvan kuvankäsittelyyn ja tehneet joitain kuvan edistyneitä toimintoja. Kuten tiedämme, OpenCV on avoimen lähdekoodin Commuter Vision -kirjasto, jolla on C ++ -, Python- ja Java-liitännät ja joka tukee Windowsia, Linuxia, Mac OS: ää, iOS: ää ja Androidia. Joten se voidaan helposti asentaa Raspberry Pi -ohjelmaan Python- ja Linux-ympäristössä. Ja Raspberry Pi -ohjelmaa, jossa on OpenCV ja liitetty kamera, voidaan käyttää luomaan monia reaaliaikaisia kuvankäsittelysovelluksia, kuten kasvojentunnistus, kasvojen lukitus, esineiden seuranta, auton rekisterikilven tunnistus, kodin turvajärjestelmä jne. Tässä opetusohjelmassa opitaan, miten kuvan segmentointi käyttämällä OpenCV: tä. Toiminnot, jotka aiomme suorittaa, on lueteltu alla:
- Segmentointi ja muodot
- Hierarkia ja hakutila
- Muotojen lähentäminen ja niiden kuperan rungon löytäminen
- Conex Hull
- Vastaava muoto
- Tunnistavat muodot (ympyrä, suorakulmio, kolmio, neliö, tähti)
- Linjan tunnistus
- Blob-tunnistus
- Suodata möykky - lasketaan ympyrät ja ellipsit
1. Segmentointi ja muodot
Kuvan segmentointi on prosessi, jolla osiot kuvat jaetaan eri alueille. Taas ääriviivat ovat jatkuvia viivoja tai käyriä, jotka sitovat tai kattavat rajan objektin kuvan. Ja tässä käytämme kuvan segmentointitekniikkaa, jota kutsutaan ääriviivoiksi kuvan osien purkamiseksi.
Myös ääriviivat ovat erittäin tärkeitä
- Kohteen tunnistus
- Muotoanalyysi
Ja niillä on hyvin laaja käyttöalue tosielämän kuva-analyysistä lääketieteelliseen kuva-analyysiin, kuten MRI: ssä
Tiedetään, miten ääriviivat toteutetaan opencv: ssä, poimimalla neliöiden muodot.
import cv2 import numpy np: nä
Ladataan yksinkertainen kuva, jossa on 3 mustaa neliötä
image = cv2.imread ('neliöt.jpg') cv2.imshow ('syötekuva', kuva) cv2.waitKey (0)
Harmaasävy
harmaa = cv2.cvtColor (kuva, cv2.COLOR_BGR2GRAY)
Etsi kireät reunat
reuna = cv2.Canny (harmaa, 30.200 ) cv2.imshow ('canny reunat', teräinen) cv2.waitKey (0)
Muotojen etsiminen
# käytä kopiota kuvastasi, esim. - edged.copy (), koska ääriviivojen löytäminen muuttaa kuvaa # meidän on lisättävä _, ennen ääriviivoja tyhjänä argumenttina OpenCV-version päivityksen vuoksi _, ääriviivat, hierarkia = cv2.findContours (reunattu, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('kankaan reunat muotoilun jälkeen', reunat) cv2.waitKey (0)
Muototiedoston tulostaminen tietääksesi, mistä muodot muodostuvat
tulosta (ääriviivat) tulosta ('Löydettyjen muotojen lukumäärä =' + str (len (muodot))))
Piirrä kaikki muodot
# käytä -1 3. parametrina kaikkien muotojen piirtämiseen cv2.drawContours (kuva, muodot, -1, (0,255,0), 3) cv2.imshow ('ääriviivat', kuva) cv2.waitKey (0) cv2. destrAllWindows ()
Konsolin lähtö -],],], …,],],]], dtype = int32), taulukko (],],
], …,
],],]], tyypin = int32), taulukko (],],], …,],],]], tyypin = int32)]
Löydettyjen muotojen lukumäärä = 3. Joten olemme löytäneet yhteensä kolme ääriviivaa.
Nyt yllä olevassa koodissa, jonka olimme myös tulostaneet muototiedoston käyttämällä , tämä tiedosto kertoo miltä nämä muodot näyttävät, kuten tulostettu konsolin yllä olevaan tulostukseen.
Yllä olevassa konsolilähdössä on matriisi, joka näyttää x, y pisteen koordinaateilta. OpenCV tallentaa ääriviivat luetteloluetteloihin. Voimme yksinkertaisesti näyttää yllä olevan konsolilähdön seuraavasti:
CONTOUR 1 CONTOUR 2 CONTOUR 3
], matriisi (], matriisi (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Nyt kun käytämme pituusfunktiota ääriviivatiedostossa, saamme pituuden 3, mikä tarkoittaa, että tiedostossa oli kolme luetteloluetteloa eli kolme ääriviivaa.
Kuvittele nyt, että CONTOUR 1 on kyseisen elementin ensimmäinen elementti ja että luettelo sisältää luettelon kaikista koordinaateista ja nämä koordinaatit ovat juuri näkemiemme ääriviivojen pisteitä vihreinä suorakulmaisina laatikoina.
Näiden koordinaattien tallentamiseen on olemassa erilaisia menetelmiä, ja niitä kutsutaan approksimaatiomenetelmiksi, lähinnä approksimaatiomenetelmiä on kahdenlaisia
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE tallentaa kaikki rajapisteet, mutta emme välttämättä tarvitse kaikkia rajapisteitä, jos piste muodostaa suoran, tarvitsemme vain alkupisteen ja loppupisteen tälle viivalle.
cv2.CHAIN_APPROX_SIMPLE antaa sen sijaan vain rajaavien muotojen alku- ja loppupisteet, tuloksena on paljon tehokkaampi ääriviivatietojen tallentaminen.
_, ääriviivat, hierarkia = cv2.findContours (reunattu, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Yllä olevassa koodissa cv2.RETR_EXTERNAL on hakutila, kun taas cv2.CHAIN_APPROX_NONE on
arviointimenetelmä.
Joten olemme oppineet ääriviivoista ja approksimaatiomenetelmästä, nyt tutkitaan hierarkiaa ja hakutilaa.
2. Hierarkia ja hakutila
Hakutila määrittelee hierarkian ääriviivoilla, kuten alakäyrillä, ulkoisilla ääriviivoilla tai kaikilla ääriviivoilla.
Nyt hierarkiatyyppeihin on lajiteltu neljä hakutilaa.
cv2.RETR_LIST - noutaa kaikki muodot.
cv2.RETR_EXTERNAL - hakee vain ulkoiset tai ulkoiset muodot.
cv2.RETR_CCOMP - hakee kaikki 2-tason hierarkiassa.
cv2.RETR_TREE - hakee kaikki koko hierarkiassa.
Hierarkia tallennetaan seuraavassa muodossa
Valaistaan nyt kahden ensimmäisen hakutilan, cv2.RETR_LIST ja cv2.RETR_EXTERNAL, eroa.
import cv2 import numpy np: nä
Antaa ladata yksinkertaisen kuvan, jossa on 3 mustaa neliötä
image = cv2.imread ('neliön donitsi.jpg') cv2.imshow ('syötekuva', kuva) cv2.waitKey (0)
Harmaasävy
harmaa = cv2.cvtColor (kuva, cv2.COLOR_BGR2GRAY)
Löydä Canny Edges
reuna = cv2.Canny (harmaa, 30.200 ) cv2.imshow ('canny reunat', teräinen) cv2.waitKey (0)
Muotojen etsiminen
# käytä kopiota kuvastasi, esim. - edged.copy (), koska ääriviivojen löytäminen muuttaa kuvaa # meidän on lisättävä _, ennen ääriviivat tyhjänä argumenttina avoimen cv-version päivityksen vuoksi _, ääriviivat, hierarkia = cv2.findContours (reunattu, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('reunat muotoilun jälkeen', reunat) cv2.waitKey (0)
Muototiedoston tulostaminen tietääksesi, mistä muodot muodostuvat.
tulosta (ääriviivat) tulosta ('Löydettyjen muotojen lukumäärä =' + str (len (muodot))))
Piirrä kaikki muodot
# käytä -1 3. parametrina kaikkien muotojen piirtämiseen cv2.drawContours (kuva, muodot, -1, (0,255,0), 3) cv2.imshow ('ääriviivat', kuva) cv2.waitKey (0) cv2. destrAllWindows
import cv2 import numpy np: nä
Antaa ladata yksinkertaisen kuvan, jossa on 3 mustaa neliötä
image = cv2.imread ('neliön donitsi.jpg') cv2.imshow ('syötekuva', kuva) cv2.waitKey (0)
Harmaasävy
harmaa = cv2.cvtColor (kuva, cv2.COLOR_BGR2GRAY)
Etsi kireät reunat
reuna = cv2.Canny (harmaa, 30.200 ) cv2.imshow ('canny reunat', teräinen) cv2.waitKey (0)
Muotojen etsiminen
#käytä kopiota kuvastasi, esim. - edged.copy (), koska ääriviivojen löytäminen muuttaa kuvaa # meidän on lisättävä _, ennen ääriviivat tyhjänä argumenttina avoimen cv-version päivityksen vuoksi _, ääriviivat, hierarkia = cv2.findContours (reunattu, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('kankaan reunat muotoilun jälkeen', reunat) cv2.waitKey (0)
Muototiedoston tulostaminen tietääksesi, mistä muodot muodostuvat.
tulosta (ääriviivat) tulosta ('Löydettyjen muotojen lukumäärä =' + str (len (muodot))))
Piirrä kaikki muodot
# käytä -1 3. parametrina kaikkien muotojen piirtämiseen cv2.drawContours (kuva, muodot, -1, (0,255,0), 3) cv2.imshow ('ääriviivat', kuva) cv2.waitKey (0) cv2. destrAllWindows ()
Joten yllä olevien koodien esittelyn avulla voimme nähdä selvästi eron cv2.RETR_LIST ja cv2.RETR_EXTERNNAL , kohdassa cv2.RETR_EXTERNNAL otetaan huomioon vain ulommat ääriviivat, kun taas sisäiset muodot jätetään huomiotta.
Vaikka cv2.RETR_LIST sisäprofiileista otetaan myös huomioon.
3. Muotojen lähentäminen ja niiden kuperan rungon löytäminen
Laajennettaessa ääriviivoja ääriviivat ovat likimääräisiä toisiinsa nähden, jotka eivät ehkä ole kovin samanlaisia kuin ensimmäinen muoto.
Lähentämiseen käytämme openCV: n approxPolyDP- toimintoa, joka selitetään alla
cv2.approxPolyDP (muoto, likiarvon tarkkuus, suljettu)
Parametrit:
- Muoto - on yksittäinen muoto, jonka haluamme arvioida.
- Lähentämisen tarkkuus - tärkeä parametri likiarvon tarkkuuden määrittämisessä, pieni arvo antaa tarkan likiarvon, suuret arvot antavat enemmän yleistä tietoa. Hyvä peukalosääntö on alle 5% muodon kehästä.
- Suljettu - Boolen arvo, joka ilmoittaa, voisiko likimääräinen muoto olla avoin vai suljettu.
Yritetään lähestyä yksinkertaista kuvaa talosta
tuonti numpy nimellä np import cv2
Lataa kuva ja säilytä kopio
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('alkuperäinen kuva', orig_image) cv2.waitKey (0)
Harmaasävy ja binarisoi kuva
harmaa = cv2.cvtColor (kuva, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.kynnys (harmaa, 127,255, cv2.THRESH_BINARY_INV)
Etsi ääriviivat
_, ääriviivat, hierarkia = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Toista kunkin muodon läpi ja laske niiden rajoittava suorakulmio
c: lle ääriviivoissa: x, y, w, h = cv2.rajaavaRect (c) cv2.suorakulmio (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('Bounding rect', orig_image) cv2.waitKey (0)
Toista jokaisen ääriviivan läpi ja laske noin muoto
c: lle ääriviivoissa:
#laske tarkkuus prosentteina ääriviivan tarkkuudesta = 0,03 * cv2.arcLength (c, True) noin = cv2.approxPolyDP (c, tarkkuus, True) cv2.drawContours (kuva,, 0, (0,255,0), 2) cv2.imshow ('Noin polyDP', kuva) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Kupera runko
Kupera runko on pohjimmiltaan ulkoreunoja, joita edustaa viivojen antaminen tietyn kuvan päälle.
Se voi olla pienin monikulmio, joka mahtuu itse kohteen ympärille.
tuo cv2 tuoda numerotiedosto muodossa np image = cv2.imread ('star.jpg') harmaa = cv2.cvtColor (kuva, cv2.COLOR_BGR2GRAY) cv2.imshow ('alkuperäinen kuva', kuva) cv2.waitKey (0)
Rajaa kuva
ret, thresh = cv2.threshold (harmaa, 176255,0)
Etsi ääriviivat
_, ääriviivat, hierarkia = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Lajittele ääriviivat alueen mukaan ja poista sitten suurin kehyksen muoto
n = len (ääriviivat) -1 muodot = lajiteltu (ääriviivat, avain = cv2. muodon alue, käänteinen = väärä)
Toista muodot ja vedä kupera runko
c: lle ääriviivoissa:
hull = cv2.convexHull (c) cv2.drawContours (kuva,, 0, (0,255,0), 2) cv2.imshow ('kupera runko, kuva) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Muotojen sovittaminen muotojen mukaan
cv2.matchShapes (muotomalli, ääriviivatapa, menetelmäparametri)
Tulos - osuma-arvo (pienempi arvo tarkoittaa lähempää vastaavuutta)
ääriviivamalli - Tämä on referenssiviiva, jonka yritämme löytää uudesta kuvasta.
muoto - Yksittäinen muoto, jota tarkastamme.
Menetelmä - muodon sovituksen tyyppi (1,2,3).
method-parametri - jätä yksin 0,0 (ei käytetä python opencv: ssä)
import cv2 import numpy np: nä
Lataa muotomalli tai viitekuva
malli = cv2.imread ('tähti.jpg', 0) cv2.imshow ('malli', malli) cv2.waitKey (0)
Lataa kohdekuva muodoilla, joita yritämme löytää
target = cv2.imread ('shapestomatch.jpg') harmaa = cv2.cvtColor (kohde, cv2.COLOR_BGR2GRAY)
Rajaa molemmat kuvat ensin ennen cv2.findContoursin käyttöä
ret, thresh1 = cv2.threshold (malli, 127255,0) ret, thresh2 = cv2.threshold (harmaa, 127255,0)
Etsi muodot mallista
_, ääriviivat, hierarhia = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # meidän on lajiteltava ääriviivat alueittain, jotta voimme poistaa suurimman ääriviivan
Kuvan ääriviivat
sorted_contours = lajiteltu (ääriviivat, avain = cv2.contourArea, käänteinen = True) # poimimme toiseksi suurimman muodon, joka on mallimme ääriviiva tempelate_contour = muodot # poimi ääriviivat toisesta kohdekuvasta _, ääriviivat, hierarkia = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) ja c ääriviivat: #iterate läpi kunkin rata kohdekuvan ja käyttö cv2.matchShape verrata ääriviivamuotoa match = cv2.matchShapes (tempelate_contour, c, 1,0.0) tulosta ("ottelu") # jos vastaavuusarvo on alle 0,15, jos osuma on <0,16: lähin_muoto = c muu: lähin_muoto = cv2.drawContours (kohde,, - 1, (0,255,0), 3) cv2.imshow ('lähtö',kohde) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsolin ulostulo -
0,16818605122199104
0,19946910256158912
0,188949760627309664
0.11101058276281539
On olemassa kolme erilaista menetelmää, joilla on erilainen matematiikkatoiminto, voimme kokeilla kutakin menetelmää korvaamalla vain cv2.matchShapes (tempelate_contour, c, 1, 0.0) -menetelmän arvot, jotka vaihtelevat välillä 1,2 ja 3, jokaiselle arvolle saat erilaisen vastaavuuden arvot konsolin lähdössä.
6. Tunnistettavat muodot (ympyrä, suorakulmio, kolmio, neliö, tähti)
OpenCV: tä voidaan käyttää myös erityyppisten muotojen tunnistamiseen kuvasta automaattisesti. Käyttämällä alla olevaa koodia voimme havaita ympyrän, suorakulmion, kolmion, neliön ja tähdet kuvasta.
import cv2 import numpy np: nä
Lataa ja harmaasävyiset kuvat
image = cv2.imread ('shape.jpg') harmaa = cv2.cvtColor (kuva, cv2.COLOR_BGR2GRAY) cv2.imshow ('muotojen tunnistaminen', kuva) cv2.waitKey (0) ret, thresh = cv2.threshold (harmaa, 127,255,1)
Pura muodot
_, ääriviivat, hierarkia = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Muotojen cnt: lle:
Hanki likimääräiset polygonit noin = cv2.approxPolyDP (cnt, 0,01 * cv2.arcLength (cnt, True), True) jos len (noin) == 3: shape_name = "Kolmio" cv2.drawContours (kuva,, 0, (0,255, 0), - 1)
etsi ääriviivakeskus tekstin sijoittamiseksi keskelle
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (kuva, muodon_nimi, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (noin) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M)
Tarkista, onko kyseinen neljäpuolinen monikulmio neliö tai suorakulmio
# cv2.boundingRect palauttaa vasemman leveyden ja korkeuden pikseleinä alkaen ylhäältä # vasemmasta kulmasta. Neliön kohdalla se olisi suunnilleen sama, jos abs (wh) <= 3: shape_name = "neliö" # etsi ääriviiva keskelle tekstin sijoittamiseksi keskellä cv2.drawContours (kuva,, 0, (0,125,255), - 1) cv2.putText (kuva, muodon_nimi, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) else: shape_name = "Reactangle" # etsi ääriviivakeskus tekstin sijoittamiseksi keskelle cv2.drawContours (kuva,, 0, (0,0255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (kuva, muodon_nimi, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (noin) == 10: muoto_nimi = 'tähti' cv2.drawContours (kuva,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (kuva, muodon_nimi, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (noin)> = 15: shape_name = 'ympyrä' cv2.drawContours (kuva,, 0, (0,255255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (kuva, muodon_nimi, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('muotojen tunnistaminen', kuva) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Linjan tunnistus
Linjan tunnistus on erittäin tärkeä käsite OpenCV: ssä, ja sillä on lupaava käyttö todellisessa maailmassa. Autonomiset autot käyttävät juovan havaitsemisalgoritmeja kaistojen ja teiden havaitsemiseen.
Linjatunnistuksessa käsitellään kahta algoritmia,
- Hough-linja-algoritmi
- Probalistinen Hough-linjan algoritmi.
Olet ehkä muistanut lukion matematiikan viivan esityksen yhtälöllä y = mx + c.
OpenCV-linjaa edustaa kuitenkin toinen tapa
Yllä oleva yhtälö ρ = xcosӨ + ysincosӨ on suoran OpenCV-esitys, jossa ρ on linjan kohtisuora etäisyys alkuperästä ja Ө on kulma, jonka tämän linjan normaali muodostaa alkupisteeseen (mitattuna radiaaneina, missä 1pi radiaania / 180 = 1 aste).
Linjan havaitsemiseen tarkoitettu OpenCV-toiminto annetaan muodossa
cv2.HoughLines (binarisoitu kuva, ρ-tarkkuus, Ө tarkkuus, kynnys), jossa kynnys on vähimmäisäänestys, jotta sitä voidaan pitää viivana.
Havaitaan nyt laatikkokuvan viivat opencv: n Hough-viivatoiminnon avulla.
Tuo cv2 Tuo numerotiedosto muodossa np image = cv2.imread ('box.jpg')
Harmaasävy ja kanny reunat uutettu
harmaa = cv2.cvtColor (kuva, cv2.COLOR_BGR2GRAY) reunat = cv2.Canny (harmaa, 100,170, aukon koko = 3)
Suorita Hough-linjat käyttämällä 1 pikselin tarkkuutta
# teeta-tarkkuus (np.pi / 180), joka on 1 aste # viivakynnys, asetetaan arvoon 240 (pisteiden määrä rivillä) viivat = cv2.HoughLines (reunat, 1, np.pi / 180, 240) # toistamme jokaisen rivin läpi ja muunna se muotoon #, jota cv2.lines vaatii (ts. edellyttävät loppupisteitä) i: lle alueella (0, len (rivit)): rho: lle, theta rivillä: a = np.cos (theta) b = np.sin (theta) x0 = a * rho y0 = b * rho x1 = int (x0 + 1000 * (- b)) y1 = int (y0 + 1000 * (a)) x2 = int (x0-1000 * (-b)) y2 = int (y0-1000 * (a)) cv2.linja (kuva, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('viivat', kuva) cv2.waitKey (0) cv2.destroyAllWindows ()
Toistetaan nyt edellä olevan viivan havaitseminen todennäköisyysarvoltaan Hough-linjan muun algoritmin kanssa.
Todennäköisen Hough-linjan idea on ottaa satunnaisjoukko pisteitä, jotka ovat riittävät linjan havaitsemiseen.
Todennäköisen Hough-linjan OpenCV-toiminto on esitetty muodossa cv2.
Tunnistetaan nyt laatikkolinjat todennäköisyystekijöiden Hough-viivojen avulla.
import cv2 import numpy np: nä
Harmaasävy ja sävyt reunat Uutettu
image = cv2.imread ('box.jpg') harmaa = cv2.cvtColor (kuva, cv2.COLOR_BGR2GRAY) reunat = cv2.Canny (harmaa, 50,150, aukkoSize = 3) # jälleen käytämme samoja rho- ja theta-tarkkuuksia # kuitenkin me määritämme vähintään äänestys (pts pitkin linjaa) 100 #and min linjan pituus 5 pikselistä, ja max kuilu riviä 10 pikseliä riviä = cv2.HoughLinesP (reunat, 1, np.pi / 180,100,100,10) i alueella (0, len (rivit)): x1, y1, x2, y2 rivillä: cv2.line (kuva, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('probalistic hough lines', image) cv2.waitKey (0) cv2.destroyAllWindows
8. Blob-tunnistus
Lohkot voidaan kuvata yhdistettyjen pikselien ryhmäksi, joilla kaikilla on yhteinen ominaisuus. Menetelmä OpenCV-blob-ilmaisimen käyttämiseksi kuvataan tämän vuokaavion kautta.
Avainkohtien piirtämiseen käytämme cv2.drawKeypoints, joka ottaa seuraavat argumentit.
cv2.drawKeypoints (syötekuva, avainkohdat, blank_output_array, väri, liput)
missä liput voisivat olla
cv2.DRAW_MATCHES_FLAGS_DEFAULT
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
ja tyhjä tässä on melkein mitään muuta kuin yksi kerrallaan nollamatriisi
Suoritetaan nyt möykkyilmaisu auringonkukkien kuvalle, jossa läiskät olisivat kukan keskiosia, koska ne ovat yleisiä kaikkien kukkien joukossa.
tuo cv2 tuoda numerotiedosto muodossa np image = cv2.imread ('Auringonkukat.jpg', cv2.IMREAD_GRAYSCALE)
Määritä ilmaisin oletusparametreilla
detector = cv2.SimpleBlobDetector_create ()
Tunnista läiskät
avainkohdat = detector.detect (kuva)
Piirrä havaitut läiskät punaisina ympyröinä
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS varmista, että ympyrän # koko vastaa blob- aihion kokoa = np.zeros ((1,1)) blobs = cv2.drawKeypoints (kuva, avainkohdat, tyhjä, (0,255,255), cv2.SDWA
Näytä avainkohdat
cv2.imshow ('blobs', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()
Vaikka koodi toimii hyvin, mutta jotkut läiskät puuttuvat kukkien epätasaisesta koosta johtuen, koska edessä olevat kukat ovat suuria verrattuna lopussa oleviin kukkiin.
9. Blobien suodattaminen - ympyröiden ja ellipsien laskeminen
Voimme käyttää parametreja suodattaa läpät niiden muodon, koon ja värin mukaan. Parametrien käyttämiseen blob-ilmaisimen kanssa käytämme OpenCV: n toimintoa
cv2.SimpleBlobDetector_Params ()
Näemme suodattaa läiskät pääasiassa näiden neljän alla luetellun parametrin perusteella:
Alue
params.filterByArea = True / False params.minArea = pikseliä params.maxArea = pikseliä
Kiertokulku
params.filterByCircularity = True / False params.minCircularity = 1 täydellinen, 0 vastakkainen
Kupera - möykky / kuperan rungon alue
params.filterByConvexity = True / False params.minConvexity = Alue
Inertia
params.filterByInertia = True / False params.minInertiaRatio = 0,01
Yritetään nyt suodattaa läiskät yllä mainittujen parametrien mukaan
Tuo cv2 Tuo numerotiedosto muodossa np image = cv2.imread ('blobs.jpg') cv2.imshow ('alkuperäinen kuva', kuva) cv2.waitKey (0)
Alusta ilmaisin oletusparametreilla
detector = cv2.SimpleBlobDetector_create ()
Tunnista läiskät
avainkohdat = detector.detect (kuva)
Piirrä kuvaan punaisia ympyröitä
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (kuva, avainkohdat, tyhjä, (0,0255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = " merkkipalojen kokonaismäärä" + (len (avainkohdat)) cv2.putText (blobit, teksti, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0255), 2)
Näytä kuva möykkyillä avainkohdilla
cv2.imshow ('blob using default parameters', blobs) cv2.waitKey (0)
Aseta suodatusparametrit
#initialize parametriasetus käyttämällä cv2.SimpleBlobDetector-parametreja = cv2.SimpleBlobDetector_Params ()
Aseta alueen suodatusparametrit
params.filterByArea = Todelliset params.minArea = 100
Aseta kierrossuodatusparametrit
params.filterByCircularity = Todelliset params.minCircularity = 0,9
Aseta kuperuuden suodatusparametri
params.filterByConvexity = Väärät params.minConvexity = 0,2
Aseta inertiasuodatuksen parametri
params.filterByInertia = Todelliset params.minInertiaRatio = 0,01
Luo ilmaisin parametrilla
detector = cv2.SimpleBlobDetector_create (parametrit)
Tunnista läiskät
avainkohdat = detector.detect (kuva)
Piirrä kuviin punaisia ympyröitä
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "pyöreiden lohkojen kokonaismäärä" str (len (avainkohdat)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Näytä läiskät
cv2.imshow ('suodatetaan pyöreät läiskät', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()
Joten näin kuvan segmentointi voidaan tehdä Python-OpenCV: ssä. Tietokonenäön ja OpenCV: n aliarvioimiseksi käy läpi edelliset artikkelit (Python OpenCV: n ja Python OpenCV: n kuvankäsittelyjen aloittaminen ja voit tehdä jotain hienoa Computer Visionin avulla.