- 1. Segmentacija i konture
- 2. Hijerarhija i način pretraživanja
- 3. Približavanje kontura i pronalaženje njihovog ispupčenog trupa
- 4. Konveksni trup
- 5. Usklađivanje konture po oblicima
- 6. Prepoznavanje oblika (krug, pravokutnik, trokut, kvadrat, zvijezda)
- 7. Otkrivanje crte
- 8. Otkrivanje mrlja
- 9. Filtriranje mrlja - brojanje krugova i elipsa
U prethodnim tutorijalima koristili smo OpenCV za osnovnu obradu slike i izveli neke prethodne operacije uređivanja slika. Kao što znamo, OpenCV je Open Source Commuter Vision Library koja ima C ++, Python i Java sučelja i podržava Windows, Linux, Mac OS, iOS i Android. Tako se može lako instalirati u Raspberry Pi s Pythonom i Linux okruženjem. A Raspberry Pi s OpenCV-om i priključenom kamerom može se koristiti za stvaranje mnogih aplikacija za obradu slika u stvarnom vremenu poput otkrivanja lica, zaključavanja lica, praćenja predmeta, otkrivanja pločica automobila, kućnog sigurnosnog sustava itd. U ovom uputstvu naučit ćemo kako to učiniti segmentacija slike pomoću OpenCV-a. Operacije koje ćemo izvesti navedene su u nastavku:
- Segmentacija i konture
- Hijerarhija i način pretraživanja
- Približavanje kontura i pronalaženje njihovog konveksnog trupa
- Conex Hull
- Odgovarajuća kontura
- Prepoznavanje oblika (krug, pravokutnik, trokut, kvadrat, zvijezda)
- Detekcija linije
- Otkrivanje mrlja
- Filtriranje mrlja - brojanje krugova i elipsa
1. Segmentacija i konture
Segmentacija slike postupak je kojim slike dijelimo na različita područja. Dok su konture neprekidne crte ili krivulje koje ograničavaju ili pokrivaju punu granicu objekta na slici. I ovdje ćemo upotrijebiti tehniku segmentacije slike koja se naziva konture za izdvajanje dijelova slike.
Također su konture vrlo važne u
- Otkrivanje predmeta
- Analiza oblika
I oni imaju vrlo široko područje primjene, od analize stvarnog svijeta do medicinske analize slike kao što je MR
Znajmo kako implementirati konture u opencv, izvlačenjem kontura kvadrata.
uvoz cv2 uvoz numpy kao np
Učitajmo jednostavnu sliku s 3 crna kvadrata
image = cv2.imread ('squares.jpg') cv2.imshow ('ulazna slika', slika) cv2.waitKey (0)
Sive nijanse
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GREY)
Pronađi čvrste rubove
edged = cv2.Canny (siva, 30.200) cv2.imshow ('oštri rubovi', obrubljeni) cv2.waitKey (0)
Pronalaženje kontura
#koristite kopiju slike, npr. - edged.copy (), jer pronalaženje kontura mijenja sliku # moramo dodati _, prije kontura kao prazan argument zbog nadogradnje verzije OpenCV _, konture, hijerarhija = cv2.findContours (obrubljeni, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('oštri rubovi nakon konture', obrubljeni) cv2.waitKey (0)
Ispis datoteke konture kako biste znali koje se konture sastoje od
print (konture) print ('Pronađeni brojevi kontura =' + str (len (konture)))
Nacrtajte sve konture
#koristite -1 kao 3. parametar za crtanje svih kontura cv2.drawContours (slika, konture, -1, (0,255,0), 3) cv2.imshow ('konture', slika) cv2.waitKey (0) cv2. uništitiAllWindows ()

Izlaz konzole -],],], …,],],]], dtype = int32), niz (],],
], …,
],],]], dtype = int32), niz (],],], …,],],]], dtype = int32)]
Broj pronađenih kontura = 3. Dakle, pronašli smo ukupno tri konture.
Sada, u gornjem kodu koji smo također ispisali datoteku s konturama , ova datoteka govori kako izgledaju ove konture, kao što je ispisano u gornjem izlazu konzole.
U gornjem izlazu konzole imamo matricu koja izgleda kao koordinate x, y točaka. OpenCV sprema konture na popise popisa. Jednostavno možemo prikazati gornji izlaz konzole na sljedeći način:
KONTURA 1 KONTURA 2 KONTURA 3
], niz (], niz (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Sada, dok koristimo funkciju duljine na datoteci konture, dobivamo duljinu jednaku 3, što znači da su u toj datoteci postojala tri popisa popisa, tj. Tri konture.
Sada, zamislimo da je CONTOUR 1 prvi element u tom nizu i taj popis sadrži popis svih koordinata, a te koordinate su točke duž kontura koje smo upravo vidjeli, kao zeleni pravokutni okviri.
Postoje različite metode za pohranu ovih koordinata i one se nazivaju aproksimacijskim metodama, u osnovi su metode aproksimacije dvije vrste
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE pohranjuje sve granične točke, ali ne trebaju nam nužno sve granične točke, ako točka tvori ravnu crtu, trebamo samo početnu i završnu točku na toj liniji.
cv2.CHAIN_APPROX_SIMPLE umjesto toga pruža samo početnu i završnu točku ograničavajućih kontura, rezultat je mnogo učinkovitije pohranjivanje podataka o konturama.
_, konture, hijerarhija = cv2.findContours (obrubljeni, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
U gore kod cv2.RETR_EXTERNAL je pronalaženje načina rada, a cv2.CHAIN_APPROX_NONE je
metoda aproksimacije.
Dakle, naučili smo o konturama i metodi aproksimacije, sada ćemo istražiti hijerarhiju i način pretraživanja.
2. Hijerarhija i način pretraživanja
Način pronalaženja definira hijerarhiju u konturama poput pod kontura ili vanjske konture ili svih kontura.
Sada postoje četiri načina dohvaćanja razvrstana po vrstama hijerarhije.
cv2.RETR_LIST - dohvaća sve konture.
cv2.RETR_EXTERNAL - dohvaća samo vanjske ili vanjske konture.
cv2.RETR_CCOMP - dohvaća sve u hijerarhiji na 2 razine.
cv2.RETR_TREE - dohvaća sve u punoj hijerarhiji.
Hijerarhija je pohranjena u sljedećem formatu
Sad ćemo ilustrirati razliku između prva dva načina dohvaćanja, cv2.RETR_LIST i cv2.RETR_EXTERNAL.
uvoz cv2 uvoz numpy kao np
Omogućujemo učitavanje jednostavne slike s 3 crna kvadrata
image = cv2.imread ('square donut.jpg') cv2.imshow ('ulazna slika', slika) cv2.waitKey (0)
Sive nijanse
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GREY)
Pronađite Canny Edges
edged = cv2.Canny (siva, 30.200) cv2.imshow ('oštri rubovi', obrubljeni) cv2.waitKey (0)
Pronalaženje kontura
#koristite kopiju vaše slike, npr. - edged.copy (), jer pronalaženje kontura mijenja sliku # moramo dodati _, prije kontura kao prazan argument zbog nadogradnje otvorene cv verzije _, contours, hierarchy = cv2.findContours (obrubljeni, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('oštri rubovi nakon konture', obrubljeni) cv2.waitKey (0)
Ispis datoteke konture kako bi se znalo koje se konture sastoje od.
print (konture) print ('Pronađeni brojevi kontura =' + str (len (konture)))
Nacrtajte sve konture
#koristite -1 kao 3. parametar za crtanje svih kontura cv2.drawContours (slika, konture, -1, (0,255,0), 3) cv2.imshow ('konture', slika) cv2.waitKey (0) cv2. uništitiAllWindows

uvoz cv2 uvoz numpy kao np
Omogućujemo učitavanje jednostavne slike s 3 crna kvadrata
image = cv2.imread ('square donut.jpg') cv2.imshow ('ulazna slika', slika) cv2.waitKey (0)
Sive nijanse
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GREY)
Pronađi čvrste rubove
edged = cv2.Canny (siva, 30.200) cv2.imshow ('oštri rubovi', obrubljeni) cv2.waitKey (0)
Pronalaženje kontura
#koristite kopiju vaše slike, npr. - edged.copy (), jer pronalaženje kontura mijenja sliku # moramo dodati _, prije kontura kao prazan argument zbog nadogradnje otvorene cv verzije _, contours, hierarchy = cv2.findContours (obrubljeni, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('oštri rubovi nakon konture', obrubljeni) cv2.waitKey (0)
Ispis datoteke konture kako bi se znalo koje se konture sastoje od.
print (konture) print ('Pronađeni brojevi kontura =' + str (len (konture)))
Nacrtajte sve konture
#koristite -1 kao 3. parametar za crtanje svih kontura cv2.drawContours (slika, konture, -1, (0,255,0), 3) cv2.imshow ('konture', slika) cv2.waitKey (0) cv2. uništitiAllWindows ()

Dakle, kroz demonstraciju gornjih kodova mogli smo jasno vidjeti razliku između cv2.RETR_LIST i cv2.RETR_EXTERNNAL , u cv2.RETR_EXTERNNAL uzimaju se u obzir samo vanjske konture dok se unutarnje konture zanemaruju.
Dok se u cv2.RETR_LIST uzimaju u obzir i unutarnje konture.
3. Približavanje kontura i pronalaženje njihovog ispupčenog trupa
U aproksimacijskim konturama, oblik konture se aproksimira preko drugog oblika konture, koji možda nije toliko sličan prvom obliku konture.
Za približavanje koristimo approxPolyDP funkciju OpenCV što je objašnjeno u nastavku
cv2.approxPolyDP (kontura, točnost aproksimacije, zatvoreno)
Parametri:
- Kontura - je pojedinačna kontura koju želimo približiti.
- Točnost aproksimacije - važan parametar u određivanju točnosti aproksimacije, male vrijednosti daju preciznu aproksimaciju, velike vrijednosti daju više generičkih informacija. Dobro pravilo palca je manje od 5% oboda konture.
- Zatvoreno - logička vrijednost koja navodi može li približna kontura biti otvorena ili zatvorena.
Pokušajmo približiti jednostavan lik kuće
uvoz numpy kao np uvoz cv2
Učitajte sliku i zadržite kopiju
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('original image', orig_image) cv2.waitKey (0)
Siva skala i binarizirajte sliku
siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold (siva, 127.255, cv2.THRESH_BINARY_INV)
Pronađite konture
_, konture, hijerarhija = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Prelistajte svaku konturu i izračunajte njihov ograničavajući pravokutnik
za c u konturama: x, y, w, h = cv2.boundingRect (c) cv2.rectangle (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('Ograničavajući rect', orig_image) cv2.waitKey (0)
Prelistajte svaku konturu i izračunajte približnu konturu
za c u konturama:
# izračunaj točnost kao postotak točnosti oboda konture = 0,03 * cv2.arcLength (c, True) približno = cv2. ApproxPolyDP (c, toč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 u osnovi su vanjski rubovi, predstavljeni crtanjem crta preko određene slike.
To bi mogao biti najmanji poligon koji može stati oko samog 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)
Ograničite sliku
ret, thresh = cv2.threshold (sivo, 176.255,0)
Pronađite konture
_, konture, hijerarhija = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Razvrstajte konture po površini, a zatim uklonite najveću konturu okvira
n = len (konture) -1 konture = sortirano (konture, ključ = cv2.contourArea, revers = False)
Prelistajte konture i nacrtajte konveksni trup
za c u konturama:
trup = cv2.convexHull (c) cv2.drawContours (slika,, 0, (0,255,0), 2) cv2.imshow ('konveksni trup', slika) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Usklađivanje konture po oblicima
cv2.matchShapes (konturni predložak, metoda konture, parametar metode)
Izlaz - vrijednost podudaranja (niža vrijednost znači bliže podudaranje)
predložak konture - ovo je naša referentna kontura koju pokušavamo pronaći na novoj slici.
kontura - pojedinačna kontura protiv koje provjeravamo.
Metoda - Vrsta podudaranja kontura (1,2,3).
parametar metode - ostavite na miru kao 0.0 (ne koristi se u python opencv)
uvoz cv2 uvoz numpy kao np
Učitajte predložak oblika ili referentnu sliku
template = cv2.imread ('star.jpg', 0) cv2.imshow ('template', template) cv2.waitKey (0)
Učitajte ciljanu sliku oblicima s kojima se pokušavamo podudarati
target = cv2.imread ('shapestomatch.jpg') grey = cv2.cvtColor (target, cv2.COLOR_BGR2GREY)
Prije korištenja cv2.findContours prvo graničite obje slike
ret, thresh1 = cv2.threshold (predložak, 127.255,0) ret, thresh2 = cv2.threshold (sivi, 127.255,0)
Pronađite konture u predlošku
_, konture, hijerarhija = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # trebamo sortirati konture po površini kako bismo mogli ukloniti najveću konturu koja je
Obris slike
sorted_contours = sorted (contours, key = cv2.contourArea, reverse = True) # izvlačimo drugu najveću konturu koja će biti naš predložak kontura tempelate_contour = konture # izvlačenje kontura iz druge ciljne slike _, konture, hijerarhija = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) za c u konturama: # pređite kroz svaku konturu na ciljanoj slici i upotrijebite cv2.matchShape za usporedbu oblika podudaranja konture = cv2.matchShapes (tempelate_contour, c, 1,0.0) print ("match") # ako je vrijednost podudaranja manja od 0,15 ako je match <0,16: najbliža_kontura = c else: najbliža_kontura = cv2.drawContours (target,, - 1, (0,255,0), 3) cv2.imshow ('output',cilj) cv2.waitKey (0) cv2.destroyAllWindows ()

Izlaz konzole -
0,16818605122199104
0,19946910256158912
0,18949760627309664
0,11101058276281539
Postoje tri različite metode s različitim matematičkim funkcijama, možemo eksperimentirati sa svakom metodom samo zamjenom vrijednosti metode cv2.matchShapes (tempelate_contour, c, 1, 0.0) koja varira od 1,2 i 3, za svaku vrijednost dobit ćete različito podudaranje vrijednosti u izlazu konzole.
6. Prepoznavanje oblika (krug, pravokutnik, trokut, kvadrat, zvijezda)
OpenCV se također može koristiti za automatsko otkrivanje različitih vrsta oblika sa slike. Korištenjem donjeg koda moći ćemo na slici otkriti krug, pravokutnik, trokut, kvadrat i zvijezde.
uvoz cv2 uvoz numpy kao np
Učitajte, a zatim sive slike
image = cv2.imread ('shape.jpg') siva = cv2.cvtColor (slika, cv2.COLOR_BGR2GRAY) cv2.imshow ('prepoznavanje oblika', slika) cv2.waitKey (0) ret, thresh = cv2.threshold (siva, 127.255,1)
Izdvoj konture
_, konture, hijerarhija = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Za cnt u konturama:
Nabavite približne poligone približno = cv2.approxPolyDP (cnt, 0,01 * cv2.arcLength (cnt, True), True) ako je len (približno) == 3: shape_name = "Trokut" cv2.drawContours (slika,, 0, (0,255, 0), - 1)
pronađi konturno središte za postavljanje teksta u središte
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (slika, ime_ oblika, (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)
Provjerite je li četverostrani mnogougao kvadrat ili pravokutnik
# cv2.boundingRect vraća lijevu širinu i visinu u pikselima, počevši od gornjeg #lijevog kuta, za kvadrat bi bilo otprilike isto ako je abs (wh) <= 3: shape_name = "square" # nađi konturni centar da se stavi tekst na sredina cv2.drawContours (slika,, 0, (0,125,255), - 1) cv2.putText (slika, ime_ oblika, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) ostalo: shape_name = "Reactangle" # pronađi konturno središte za postavljanje teksta u središte cv2.drawContours (slika,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (slika, naziv_imena, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (približno) == 10: shape_name = 'zvijezda' cv2.drawContours (slika,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (slika, oblik_ime, (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_ oblika, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('prepoznavanje oblika', slika) cv2.waitKey (0) cv2.destroyAllWindows ()

7. Otkrivanje crte
Otkrivanje linija vrlo je važan koncept u OpenCV- u i ima obećavajuću upotrebu u stvarnom svijetu. Autonomni automobili koriste algoritme za otkrivanje linija za otkrivanje traka i cesta.
U linijskoj detekciji bavit ćemo se s dva algoritma,
- Algoritam Hough Linea
- Probalistički algoritam Hough Line-a.

Možda ste se sjećali prikaza crte iz srednjoškolske matematike s jednadžbom, y = mx + c.
Međutim, u OpenCV-u linija je predstavljena na drugi način

Jednadžba iznad ρ = xcosӨ + ysincosӨ predstavlja OpenCV prikaz crte, pri čemu je ρ okomita udaljenost crte od ishodišta, a Ө kut koji normala ove crte tvori prema ishodištu (mjereno u radijanima, pri čemu 1pi radijana / 180 = 1 stupanj).
Funkcija OpenCV za otkrivanje crte dana je kao
cv2.HoughLines (binarna slika, ρ točnost, Ө točnost, prag), pri čemu je prag minimalni glas da se smatra linijom.
Otkrijmo sada crte za sliku okvira uz pomoć funkcije Hough line of opencv.
import cv2 import numpy as np image = cv2.imread ('box.jpg')
Izvučeni sivi tonovi i oštri rubovi
sivi = cv2.cvtColor (slika, cv2.COLOR_BGR2GRAY) rubovi = cv2.Canny (sivi, 100.170, apertureSize = 3)
Pokreni Hough linije koristeći rho preciznost od 1 piksela
#theta točnost (np.pi / 180) koja je 1 stupanj # prag linije postavljen je na 240 (broj točaka na liniji) linija = cv2.HoughLines (rubovi, 1, np.pi / 180, 240) # ponavljamo kroz svaki redak i pretvorite u format # potreban cv2.lines (tj. zahtijeva krajnje točke) za i u rasponu (0, len (linije)): za rho, theta u redovima: 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 ()
Ponovimo sada otkrivanje gornje crte s drugim algoritmom vjerojatnosne Hough linije.
Ideja vjerojatnosne Hough-ove linije jest uzeti slučajni podskup točaka dovoljan za otkrivanje linija.
Funkcija OpenCV za vjerojatnu liniju Hough predstavljena je kao cv2.HoughLinesP (binarna slika, ρ točnost, Ө točnost, prag, minimalna duljina crte, maks. Razmak crte)
Otkrijmo sada linije okvira uz pomoć vjerojatnih Hough linija.
uvoz cv2 uvoz numpy kao np
Izdvojeni rubovi sive i ljuske
image = cv2.imread ('box.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) edge = cv2.Canny (grey, 50,150, apertureSize = 3) # opet koristimo istu rho i theta preciznost # međutim, određujemo minimalni glas (bodova uz liniju) od 100 # i min duljinu retka od 5 piksela i maksimalni razmak između linija od 10 piksela linija = cv2.HoughLinesP (rubovi, 1, np.pi / 180,100,100,10) za u rasponu (0, len (linije)): za x1, y1, x2, y2 u redovima: cv2.line (slika, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('probalističke linije Hough ', slika) cv2.waitKey (0) cv2.destroyAllWindows

8. Otkrivanje mrlja
Blobs se mogu opisati kao skupina povezanih piksela koji svi dijele zajedničko svojstvo. Metoda korištenja OpenCV detektora blob-a opisana je kroz ovaj dijagram toka.

Za crtanje ključnih točaka koristimo cv2.drawKeypoints koji uzima sljedeće argumente.
cv2.drawKeypoints (ulazna slika, ključne točke, blank_output_array, boja, zastavice)
gdje bi u zastavama moglo biti
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
a prazno ovdje nema gotovo ništa osim jedne po jedne matrice nula
Izvršimo sada otkrivanje mrlja na slici suncokreta, gdje bi mrlje bile središnji dijelovi cvijeta, jer su uobičajene među svim cvjetovima.
import cv2 import numpy as np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE)
Postavite detektor sa zadanim parametrima
detektor = cv2.SimpleBlobDetector_create ()
Otkrivanje mrlja
ključne točke = detektor.detect (slika)
Nacrtajte otkrivene mrlje kao crvene krugove
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS osiguravaju da # veličina kruga odgovara veličini blob-a blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (slika, ključne točke, prazno, (0,255,255), cv2.DRAW_MAGCHES_LAGATS_
Prikaži ključne točke
cv2.imshow ('blobs', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()

Iako kod dobro funkcionira, ali neke mrlje su propuštene zbog neujednačenih veličina cvjetova jer su cvjetovi sprijeda veliki u usporedbi s cvjetovima na kraju.
9. Filtriranje mrlja - brojanje krugova i elipsa
Možemo koristiti parametre za filtriranje mrlja prema njihovom obliku, veličini i boji. Za upotrebu parametara s blob detektorom koristimo funkciju OpenCV
cv2.SimpleBlobDetector_Params ()
Vidjet ćemo filtriranje blobova uglavnom prema ova četiri dolje navedena parametra:
Područje
params.filterByArea = Tačno / Netačno params.minArea = pikseli params.maxArea = pikseli
Kružnost
params.filterByCircularity = Tačno / Netačno params.minCircularity = 1 je savršeno, 0 je suprotno
Konveksnost - Područje mrlje / područje ispupčenog trupa
params.filterByConvexity = Tačno / Netačno params.minConvexity = Područje

Inercija
params.filterByInertia = Tačno / Netačno params.minInertiaRatio = 0,01

Pokušajmo sada filtrirati blobs prema gore spomenutim parametrima
import cv2 import numpy as np image = cv2.imread ('blobs.jpg') cv2.imshow ('original image', image) cv2.waitKey (0)
Inicijalizirajte detektor pomoću zadanih parametara
detektor = cv2.SimpleBlobDetector_create ()
Otkrivanje mrlja
ključne točke = detektor.detect (slika)
Nacrtajte mrlje na našoj slici kao crvene krugove
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 = "total no blobs" + str (len (ključne točke)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
Prikažite sliku s blob tipkama
cv2.imshow ('blob pomoću zadanih parametara', blobs) cv2.waitKey (0)
Postavite naše parametre filtriranja
# inicializirajte postavljanje parametara pomoću parametara cv2.SimpleBlobDetector = cv2.SimpleBlobDetector_Params ()
Postavite parametre filtriranja područja
params.filterByArea = Istiniti params.minArea = 100
Postavite parametre filtriranja kružnosti
params.filterByCircularity = Istiniti params.minCircularity = 0,9
Postavite parametar filtriranja konveksnosti
params.filterByConvexity = Lažni params.minConvexity = 0,2
Postavite parametar filtriranja inercije
params.filterByInertia = Istiniti params.minInertiaRatio = 0,01
Stvorite detektor s parametrom
detektor = cv2.SimpleBlobDetector_create (params)
Otkrivanje mrlja
ključne točke = detektor.detect (slika)
Nacrtajte mrlje na slikama kao crvene krugove
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 = "ukupni broj kružnih blobova" + str (len (ključne točke)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Pokaži mrlje
cv2.imshow ('filtriranje kružnih mrlja', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()

Dakle, ovo je način na koji se segmentacija slike može izvesti u Python-OpenCV. Da biste postigli dobro razumijevanje računalnog vida i OpenCV-a, prođite kroz prethodne članke (Početak rada s Python OpenCV-om i manipulacijom slikama u Python OpenCV-u i moći ćete napraviti nešto cool uz Computer Vision.
