- 1. Segmentacija in konture
- 2. Hierarhija in način pridobivanja
- 3. Približevanje kontur in iskanje konveksnega trupa
- 4. Konveksni trup
- 5. Ujemanje konture po oblikah
- 6. Prepoznavanje oblik (krog, pravokotnik, trikotnik, kvadrat, zvezda)
- 7. Zaznavanje črt
- 8. Zaznavanje kapljic
- 9. Filtriranje blobov - štetje krogov in elips
V prejšnjih vajah smo OpenCV uporabljali za osnovno obdelavo slik in opravili nekaj postopkov za predhodno urejanje slik. Kot vemo, je OpenCV Open Source Commuter Vision Library, ki ima vmesnike C ++, Python in Java ter podpira Windows, Linux, Mac OS, iOS in Android. Tako ga je mogoče enostavno namestiti v Raspberry Pi z okoljem Python in Linux. In Raspberry Pi z OpenCV in priključeno kamero lahko uporabimo za ustvarjanje številnih aplikacij za obdelavo slik v realnem času, kot so zaznavanje obrazov, zaklepanje obrazov, sledenje predmetom, zaznavanje registrske tablice, sistem za domačo varnost itd. V tej vadnici bomo izvedeli, kako to storiti segmentacija slike z uporabo OpenCV. Operacije, ki jih bomo izvedli, so navedene spodaj:
- Segmentacija in konture
- Hierarhija in način iskanja
- Približevanje kontur in iskanje njihovega konveksnega trupa
- Conex Hull
- Ujemajoča se kontura
- Prepoznavanje oblik (krog, pravokotnik, trikotnik, kvadrat, zvezda)
- Zaznavanje proge
- Zaznavanje kapljic
- Filtriranje blobov - štetje krogov in elips
1. Segmentacija in konture
Segmentacija slik je postopek, s katerim slike razdelimo na različna območja. Medtem ko so konture neprekinjene črte ali krivulje, ki omejujejo ali pokrivajo celotno mejo predmeta na sliki. In tu bomo uporabili tehniko segmentacije slike, imenovano konture, za ekstrakcijo delov slike.
Tudi konture so zelo pomembne v
- Zaznavanje predmetov
- Analiza oblike
In imajo zelo široko področje uporabe od analize slik v resničnem svetu do analize medicinske slike, kot je na primer magnetna resonanca
Vedejmo, kako izvajati konture v opencv, tako da izvlečemo konture kvadratov.
uvoz cv2 uvoz numpy kot np
Naložimo preprosto sliko s 3 črnimi kvadratki
image = cv2.imread ('squares.jpg') cv2.imshow ('vhodna slika', slika) cv2.waitKey (0)
Sivine
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GREY)
Poiščite nenavadne robove
edged = cv2.Canny (siva, 30.200) cv2.imshow ('canny robovi', obrobljeni) cv2.waitKey (0)
Iskanje kontur
# uporabite kopijo vaše slike, npr. - edged.copy (), saj iskanje kontur spremeni sliko # moramo dodati _, pred konturami kot prazen argument zaradi nadgradnje različice OpenCV _, contours, hierarchy = cv2.findContours (obrobljeno, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('nenavadni robovi po oblikovanju', obrobljeni) cv2.waitKey (0)
Tiskanje datoteke konture, da se ve, katere konture obsega
print (konture) print ('Število najdenih kontur =' + str (len (konture)))
Narišite vse konture
# uporabite 3. kot 3. parameter za risanje vseh kontur cv2.drawContours (slika, konture, -1, (0,255,0), 3) cv2.imshow ('konture', slika) cv2.waitKey (0) cv2. uničiAllWindows ()
Izhod konzole -],],], …,],],]], dtype = int32), matrika (],],
], …,
],],]], dtype = int32), matrika (],],], …,],],]], dtype = int32)]
Število najdenih kontur = 3. Torej smo našli skupno tri konture.
Zdaj v zgornji kodi, s katero smo natisnili tudi konturno datoteko , ta datoteka pove, kako izgledajo te konture, kot je natisnjeno v zgornjem izhodu konzole.
V zgornjem izhodu konzole imamo matriko, ki je videti kot koordinate točk x, y. OpenCV shranjuje konture na sezname seznamov. Zgornji izhod konzole lahko preprosto prikažemo na naslednji način:
CONTOUR 1 CONTOUR 2 CONTOUR 3
], matrika (], matrika (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Zdaj, ko uporabljamo funkcijo dolžine v konturni datoteki, dobimo dolžino enako 3, kar pomeni, da so bili v tej datoteki trije seznami seznamov, tj. Tri konture.
Zdaj si predstavljamo, da je CONTOUR 1 prvi element v tej matriki in ta seznam vsebuje seznam vseh koordinat, te koordinate pa so točke ob konturah, ki smo jih pravkar videli, kot zelena pravokotna polja.
Za shranjevanje teh koordinat obstajajo različne metode, ki se imenujejo približne metode, v bistvu so približne metode dveh vrst
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE shrani vse mejne točke, vendar ne potrebujemo nujno vseh mejnih točk, če točka tvori ravno črto, potrebujemo le začetno in končno točko na tej črti.
cv2.CHAIN_APPROX_SIMPLE namesto tega zagotavlja samo začetno in končno točko omejenih kontur, rezultat pa je veliko bolj učinkovito shranjevanje konturnih informacij.
_, konture, hierarhija = cv2.findContours (obrobljen, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
V zgornjo kodo cv2.RETR_EXTERNAL je iskanje načina, medtem ko je cv2.CHAIN_APPROX_NONE je
metoda približevanja.
Tako smo se naučili kontur in metode približevanja, zdaj pa raziščimo hierarhijo in način iskanja.
2. Hierarhija in način pridobivanja
Način pridobivanja določa hierarhijo v konturah, kot so pod konture, ali zunanja kontura ali vse konture.
Zdaj obstajajo štirje načini iskanja, razvrščeni po vrstah hierarhije.
cv2.RETR_LIST - pridobi vse konture.
cv2.RETR_EXTERNAL - pridobi samo zunanje ali zunanje konture.
cv2.RETR_CCOMP - pridobi vse v dvostopenjski hierarhiji.
cv2.RETR_TREE - pridobi vse v popolni hierarhiji.
Hierarhija je shranjena v naslednji obliki
Zdaj pa ponazorimo razliko med prvima načinoma iskanja, cv2.RETR_LIST in cv2.RETR_EXTERNAL.
uvoz cv2 uvoz numpy kot np
Naložimo preprosto sliko s 3 črnimi kvadratki
image = cv2.imread ('square donut.jpg') cv2.imshow ('vhodna slika', slika) cv2.waitKey (0)
Sivine
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GREY)
Poiščite Canny Edges
edged = cv2.Canny (siva, 30.200) cv2.imshow ('canny robovi', obrobljeni) cv2.waitKey (0)
Iskanje kontur
# uporabite kopijo vaše slike, npr. - edged.copy (), saj iskanje kontur spremeni sliko # moramo dodati _, pred konturami kot prazen argument zaradi nadgradnje odprte cv različice _, contours, hierarchy = cv2.findContours (obrobljeno, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('nenavadni robovi po oblikovanju', obrobljeni) cv2.waitKey (0)
Tiskanje datoteke konture, da se ve, katere konture obsega.
print (konture) print ('Število najdenih kontur =' + str (len (konture)))
Narišite vse konture
# uporabite 3. kot 3. parameter za risanje vseh kontur cv2.drawContours (slika, konture, -1, (0,255,0), 3) cv2.imshow ('konture', slika) cv2.waitKey (0) cv2. uniči vse Windows
uvoz cv2 uvoz numpy kot np
Naložimo preprosto sliko s 3 črnimi kvadratki
image = cv2.imread ('square donut.jpg') cv2.imshow ('vhodna slika', slika) cv2.waitKey (0)
Sivine
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GREY)
Poiščite nenavadne robove
edged = cv2.Canny (siva, 30.200) cv2.imshow ('canny robovi', obrobljeni) cv2.waitKey (0)
Iskanje kontur
# uporabite kopijo vaše slike, npr. - edged.copy (), saj iskanje kontur spremeni sliko # moramo dodati _, pred konturami kot prazen argument zaradi nadgradnje odprte cv različice _, contours, hierarchy = cv2.findContours (obrobljeno, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('nenavadni robovi po oblikovanju', obrobljeni) cv2.waitKey (0)
Tiskanje datoteke konture, da se ve, katere konture obsega.
print (konture) print ('Število najdenih kontur =' + str (len (konture)))
Narišite vse konture
# uporabite 3. kot 3. parameter za risanje vseh kontur cv2.drawContours (slika, konture, -1, (0,255,0), 3) cv2.imshow ('konture', slika) cv2.waitKey (0) cv2. uničiAllWindows ()
Tako smo lahko z demonstracijo zgornjih kod jasno videli razliko med cv2.RETR_LIST in cv2.RETR_EXTERNNAL , v cv2.RETR_EXTERNNAL se upoštevajo samo zunanje konture, medtem ko se notranje konture prezrejo.
Medtem ko so v cv2.RETR_LIST upoštevane tudi notranje konture.
3. Približevanje kontur in iskanje konveksnega trupa
Pri približevanju kontur se oblika konture približa drugi obliki konture, ki morda ni toliko podobna prvi obliki konture.
Za približevanje uporabljamo funkcijo približnega poliPod OpenCV, ki je razložena spodaj
cv2.approxPolyDP (kontura, natančnost približevanja, zaprto)
Parametri:
- Kontura - je posamezna kontura, ki jo želimo približati.
- Natančnost približevanja - pomemben parameter pri določanju natančnosti približka, majhne vrednosti dajejo natančen približek, velike vrednosti dajejo več splošnih informacij. Dobro pravilo palca je manj kot 5% oboda konture.
- Zaprto - logična vrednost, ki določa, ali je približna kontura lahko odprta ali zaprta.
Poskusimo približati preprosto figuro hiše
uvozi numpy kot np uvozi cv2
Naložite sliko in obdržite kopijo
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('original image', orig_image) cv2.waitKey (0)
V sivinah in binarizirajte sliko
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold (siva, 127.255, cv2.THRESH_BINARY_INV)
Poiščite konture
_, konture, hierarhija = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Prebrskajte vsako konturo in izračunajte njihov omejevalni pravokotnik
za c v konturah: x, y, w, h = cv2.boundingRect (c) cv2.rectangle (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('Bounding rect', orig_image) cv2.waitKey (0)
Ponavljajte skozi vsako konturo in izračunajte približno konturo
za c v konturah:
# izračun natančnosti kot odstotek natančnosti oboda konture = 0,03 * cv2.arcLength (c, True) približno = cv2. ApproxPolyDP (c, natančnost, True) cv2.drawContours (slika,, 0, (0,255,0), 2) cv2.imshow ('Približno polyDP', slika) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Konveksni trup
Konveksni trup so v bistvu zunanji robovi, predstavljeni z risanjem črt nad dano sliko.
To je lahko najmanjši poligon, ki se lahko prilega okoli samega predmeta.
import cv2 import numpy as np image = cv2.imread ('star.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('original image', image) cv2.waitKey (0)
Omejite sliko
ret, thresh = cv2.threshold (siva, 176.255,0)
Poiščite konture
_, konture, hierarhija = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Razvrstite konture po površini in nato odstranite največjo konturo okvirja
n = len (konture) -1 konture = razvrščeno (konture, ključ = cv2.contourArea, reverse = False)
Ponavljajte se skozi konture in narišite konveksni trup
za c v konturah:
trup = cv2.convexHull (c) cv2.drawContours (slika,, 0, (0,255,0), 2) cv2.imshow ('konveksni trup', slika) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Ujemanje konture po oblikah
cv2.matchShapes (konturna predloga, konturna metoda, parameter metode)
Izhod - vrednost ujemanja (spodnja vrednost pomeni tesnejše ujemanje)
predloga konture - to je naša referenčna kontura, ki jo poskušamo najti na novi sliki.
kontura - posamezna kontura, proti kateri preverjamo.
Metoda - vrsta ujemanja konture (1,2,3).
parameter metode - pustite pri miru kot 0,0 (ni uporabljen v python opencv)
uvoz cv2 uvoz numpy kot np
Naložite predlogo oblike ali referenčno sliko
template = cv2.imread ('star.jpg', 0) cv2.imshow ('predloga', predloga) cv2.waitKey (0)
Naložite ciljno sliko z oblikami, ki se jim skušamo ujemati
target = cv2.imread ('shapestomatch.jpg') grey = cv2.cvtColor (target, cv2.COLOR_BGR2GREY)
Pred uporabo cv2.findContours najprej omejite obe sliki
ret, thresh1 = cv2.threshold (predloga, 127.255,0) ret, thresh2 = cv2.threshold (siva, 127.255,0)
V predlogi poiščite konture
_, konture, hierarhija = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # konture moramo razvrstiti po površini, da lahko odstranimo največjo konturo, ki je
Oris slike
sorted_contours = sorted (contours, key = cv2.contourArea, reverse = True) # izvlečemo drugo največjo konturo, ki bo naša kontura predloge tempelate_contour = contours #extract the contours from the second target image _, contours, hierarchy = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) za c v konturah: # prerišite vsako konturo na ciljni sliki in uporabite cv2.matchShape za primerjavo ujemanja oblike konture = cv2.matchShapes (tempelate_contour, c, 1,0.0) print ("match") # če je vrednost ujemanja manjša od 0,15, če je ujemanje <0,16: najbližja_kontura = c else: najbližja_kontura = cv2.drawContours (target,, - 1, (0,255,0), 3) cv2.imshow ('output', tarča) cv2.waitKey (0) cv2.destroyAllWindows ()
Izhod konzole -
0,16818605122199104
0,19946910256158912
0,18949760627309664
0,11101058276281539
Obstajajo tri različne metode z različno matematično funkcijo, z vsako metodo lahko eksperimentiramo tako, da samo nadomestimo vrednosti metode cv2.matchShapes (tempelate_contour, c, 1, 0.0), ki se razlikujejo od 1,2 do 3, za vsako vrednost boste dobili drugačno ujemanje vrednosti v izhodu konzole.
6. Prepoznavanje oblik (krog, pravokotnik, trikotnik, kvadrat, zvezda)
OpenCV se lahko uporablja tudi za samodejno zaznavanje različnih vrst oblik s slike. Z uporabo spodnje kode bomo lahko na sliki zaznali krog, pravokotnik, trikotnik, kvadrat in zvezde.
uvoz cv2 uvoz numpy kot np
Naložite slike in nato sive lestvice
image = cv2.imread ('shape.jpg') siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GRAY) cv2.imshow ('prepoznavanje oblik', slika) cv2.waitKey (0) ret, thresh = cv2.threshold (siva, 127.255,1)
Izvlecite konture
_, konture, hierarhija = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Za cnt v konturah:
Pridobite približne poligone približno = cv2. ApproxPolyDP (cnt, 0,01 * cv2.arcLength (cnt, True), True), če je len (približno) == 3: shape_name = "Triangle" cv2.drawContours (slika,, 0, (0,255, 0), - 1)
poiščite konturno središče, da postavite besedilo na sredino
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (slika, ime_forme, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (približno) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M)
Preverite, ali je ta štiristranski mnogokotnik kvadrat ali pravokotnik
# cv2.boundingRect vrne levo širino in višino v slikovnih pikah, začenši od zgornjega #levega vogala, za kvadrat bi bilo približno enako, če bi abs (wh) <= 3: shape_name = "square" #frint konturni center postavil besedilo na center cv2.drawContours (image,, 0, (0,125,255), - 1) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) else: shape_name = "Reactangle" # poiščite konturno središče, da postavite besedilo v središče cv2.drawContours (slika,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (slika, ime_oblike, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (približno) == 10: shape_name = 'zvezda' cv2.drawContours (slika,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (slika, ime_oblike, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (približno)> = 15: shape_name = 'circle' cv2.drawContours (slika,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (slika, ime_forme, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('prepoznavanje oblik', slika) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Zaznavanje črt
Zaznavanje linij je v OpenCV zelo pomemben koncept in se v resničnem svetu obeta. Avtonomni avtomobili uporabljajo algoritme za zaznavanje proge za zaznavanje pasov in cest.
Pri linijskem zaznavanju bomo obravnavali dva algoritma,
- Algoritem Hough Line
- Probalistični algoritem Hough Line.
Morda ste se spomnili predstavitve črte iz srednješolske matematike z enačbo y = mx + c.
Vendar je v OpenCV vrstica predstavljena na drug način
Enačba nad ρ = xcosӨ + ysincosӨ je OpenCV predstavitev črte, pri čemer je ρ pravokotna razdalja črte od začetka in Ө kot, ki ga tvori normala te črte do začetka (merjeno v radianih, pri čemer 1pi radiani / 180 = 1 stopinja).
Funkcija OpenCV za zaznavanje proge je podana kot
cv2.HoughLines (binarna slika, ρ natančnost, Ө natančnost, prag), pri čemer je prag najmanjši glas, da se šteje za črto.
Zdaj pa zaznajmo črte za sliko polja s pomočjo funkcije Hough line v opencv.
import cv2 import numpy as np image = cv2.imread ('box.jpg')
Izvlečeni robovi sive in močne robove
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GRAY) robovi = cv2.Canny (siva, 100.170, apertureSize = 3)
Zaženite linije Hough z natančnostjo rho do 1 slikovne pike
#theta natančnost (np.pi / 180), ki je 1 stopinja # prag črte je nastavljen na 240 (število točk na črti) vrstice = cv2.HoughLines (robovi, 1, np.pi / 180, 240) # iterate skozi vsako vrstico in pretvorite v obliko #zahtevano s cv2.lines (tj. zahteva končne točke) za i v obsegu (0, len (vrstice)): za rho, theta v vrsticah: 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.line (slika, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('Hough linije', slika) cv2.waitKey (0) cv2.destroyAllWindows ()
Zdaj pa ponovimo zaznavanje zgornje črte z drugim algoritmom verjetnostne Hough-ove črte.
Ideja verjetnostne črte Hough je vzeti naključno podmnožico točk, ki je dovolj za zaznavanje črte.
Funkcija OpenCV za verjetnostno črto Hough je predstavljena kot cv2.HoughLinesP (binarna slika, ρ natančnost, Ө natančnost, prag, najmanjša dolžina črte, največja vrzel)
Zdaj zaznajmo vrstice polja s pomočjo verjetnostnih linij Hough.
uvoz cv2 uvoz numpy kot np
Robovi v sivinah in močni robovi Izvlečeni
image = cv2.imread ('box.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) edge = cv2.Canny (grey, 50,150, apertureSize = 3) # spet uporabljamo iste rho in theta natančnosti # vendar, določimo najmanj glasov (točk vzdolž črte) 100 # in najmanj dolžino vrstice 5 slikovnih pik in največjo vrzel med vrsticami 10 pik vrstic = cv2.HoughLinesP (robovi, 1, np.pi / 180,100,100,10) za i v območju (0, len (vrstice)): za x1, y1, x2, y2 v vrsticah: cv2.line (slika, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('probalistične linije Hough', slika) cv2.waitKey (0) cv2.destroyAllWindows
8. Zaznavanje kapljic
Blobs lahko opišemo kot skupino povezanih pikslov, ki imajo skupno skupno lastnost. V tem diagramu poteka je opisana metoda za uporabo OpenCV detektorja blob.
Za risanje ključnih točk uporabljamo cv2.drawKeypoints, ki upošteva naslednje argumente.
cv2.drawKeypoints (vhodna slika, ključne točke, blank_output_array, barva, zastavice)
kjer bi lahko bile v zastavah
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
in prazno tukaj je skoraj nič drugega kot ena po ena matrika ničel
Zdaj pa izvedimo zaznavanje peg na podobi sončnic, kjer bi bili mehurčki osrednji deli cvetja, saj so pogosti med vsemi cvetovi.
import cv2 import numpy as np image = cv2.imread ('Sončnice.jpg', cv2.IMREAD_GRAYSCALE)
Nastavite detektor s privzetimi parametri
detektor = cv2.SimpleBlobDetector_create ()
Zaznavanje kapljic
keypoints = detector.detect (slika)
Zaznane blobe narišite kot rdeče kroge
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS zagotavlja, da # velikost kroga ustreza velikosti blob-a blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (slika, ključne točke, prazno, (0,255,255), cv2.DRAW_MAGCHES_LAGS
Pokaži ključne točke
cv2.imshow ('blobs', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()
Kljub temu, da koda deluje v redu, nekateri blobovi pa so zamujeni zaradi neenakomerne velikosti cvetov, saj so cvetovi spredaj veliki v primerjavi s cvetovi na koncu.
9. Filtriranje blobov - štetje krogov in elips
Za filtriranje blobov lahko uporabimo parametre glede na njihovo obliko, velikost in barvo. Za uporabo parametrov z detektorjem blob uporabljamo funkcijo OpenCV
cv2.SimpleBlobDetector_Params ()
Blobs bomo videli filtrirati predvsem po teh štirih spodaj naštetih parametrih:
Območje
params.filterByArea = True / False params.minArea = slikovne pike params.maxArea = slikovne pike
Krožnost
params.filterByCircularity = True / False params.minCircularity = 1 popoln, 0 nasproten
Konveksnost - Območje blob / območje konveksnega trupa
params.filterByConvexity = True / False params.minConvexity = Območje
Inercija
params.filterByInertia = True / False params.minInertiaRatio = 0,01
Zdaj poskusimo filtrirati blobs po zgoraj omenjenih parametrih
import cv2 import numpy as np image = cv2.imread ('blobs.jpg') cv2.imshow ('original image', image) cv2.waitKey (0)
Inicializirajte detektor s privzetimi parametri
detektor = cv2.SimpleBlobDetector_create ()
Zaznavanje kapljic
keypoints = detector.detect (slika)
Na našo sliko narišite kapljice kot rdeče kroge
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (slika, ključne točke, prazno, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "skupno število blobs" + str (len (ključne točke)) cv2.putText (blobs, text, (20.550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0.255), 2)
Prikažite sliko z velikimi točkami
cv2.imshow ('blob z uporabo privzetih parametrov', blobs) cv2.waitKey (0)
Nastavite naše parametre filtriranja
#initialize nastavitev parametra z uporabo cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()
Nastavite parametre filtriranja območja
params.filterByArea = Resnični params.minArea = 100
Nastavite parametre filtriranja krožnosti
params.filterByCircularity = Resnični params.minCircularity = 0,9
Nastavite parameter filtriranja konveksnosti
params.filterByConvexity = Lažni params.minConvexity = 0,2
Nastavite parameter vztrajnostnega filtriranja
params.filterByInertia = Resnični params.minInertiaRatio = 0,01
Ustvari detektor s parametrom
detector = cv2.SimpleBlobDetector_create (params)
Zaznavanje kapljic
keypoints = detector.detect (slika)
Na slike narišite kapljice kot rdeče kroge
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (slika, ključne točke, prazno, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "skupno število krožnih blob" + str (len (ključne točke)) cv2.putText (blobs, text, (20.550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Pokaži blobs
cv2.imshow ('filtriranje krožnih blobs', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()
Tako lahko v Python-OpenCV izvedemo segmentacijo slik. Če želite dobro podceniti računalniški vid in OpenCV, si oglejte prejšnje članke (Kako začeti s Python OpenCV in Image Manipulations v Python OpenCV in s programom Computer Vision boste lahko naredili nekaj kul).