- 1. Segmentavimas ir kontūrai
- 2. Hierarchija ir paieškos būdas
- 3. Kontūrų priartinimas ir jų išgaubto korpuso radimas
- 4. Išgaubtas korpusas
- 5. Kontūro derinimas pagal formas
- 6. Formų identifikavimas (apskritimas, stačiakampis, trikampis, kvadratas, žvaigždė)
- 7. Linijos aptikimas
- 8. Lėkštės aptikimas
- 9. Blobs filtravimas - apskritimų ir elipsių skaičiavimas
Ankstesnėse mokymo programose pagrindiniam vaizdų apdorojimui naudojome „OpenCV“ ir atlikome keletą išankstinių vaizdo redagavimo operacijų. Kaip žinome, „ OpenCV“ yra „Open Source Commuter Vision“ biblioteka, turinti C ++, Python ir Java sąsajas ir palaikanti „Windows“, „Linux“, „Mac OS“, „iOS“ ir „Android“. Taigi jį galima lengvai įdiegti į „Raspberry Pi“ su „Python“ ir „Linux“ aplinka. „Raspberry Pi“ su „OpenCV“ ir prijungta kamera gali būti naudojama kuriant daugybę realaus laiko vaizdo apdorojimo programų, tokių kaip veido aptikimas, veido užraktas, objektų sekimas, automobilio numerio atpažinimas, namų apsaugos sistema ir kt. Šioje pamokoje sužinosime, kaip tai padaryti vaizdo segmentavimas naudojant „OpenCV“. Operacijos, kurias atliksime, yra išvardytos toliau:
- Segmentavimas ir kontūrai
- Hierarchija ir paieškos būdas
- Apytiksliai priartinant kontūrus ir surandant jų išgaubtą korpusą
- „Conex Hull“
- Sutampantis kontūras
- Identifikuojančios formos (apskritimas, stačiakampis, trikampis, kvadratas, žvaigždė)
- Linijos aptikimas
- Lėkštės aptikimas
- Blobų filtravimas - apskritimų ir elipsių skaičiavimas
1. Segmentavimas ir kontūrai
Vaizdų segmentavimas yra procesas, kurio metu mes suskirstome vaizdus į skirtingus regionus. Kadangi kontūrai yra nuolatiniai linijos arba kreivės, kad jungiasi arba padengti visą sieną objekto į vaizdą. Ir čia mes naudosime vaizdo segmentavimo techniką, vadinamą kontūrais, kad išgautume vaizdo dalis.
Taip pat kontūrai yra labai svarbūs
- Objektų aptikimas
- Formos analizė
Jie turi labai platų taikymo sritį nuo realaus pasaulio vaizdo analizės iki medicininės vaizdo analizės, tokios kaip MRT
Žinokime, kaip pritaikyti kontūrus opencv, išgaunant kvadratų kontūrus.
import cv2 import numpy kaip np
Įkelkime paprastą vaizdą su 3 juodais langeliais
image = cv2.imread ('kvadratai.jpg') cv2.imshow ('įvesties vaizdas', vaizdas) cv2.waitKey (0)
Pilkoji skalė
pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY)
Raskite sugedusius kraštus
kraštas = cv2.Canny (pilka, 30.200) cv2.imshow (' canny edge', briaunoti) cv2.waitKey (0)
Kontūrų radimas
#naudokite savo atvaizdo kopiją, pvz., - edged.copy (), nes radę kontūrus pakeičiame vaizdą # mes turime pridėti _, prieš kontūrus kaip tuščią argumentą dėl „OpenCV“ versijos atnaujinimo _, kontūrai, hierarchija = cv2.findContours (apbrėžtas, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('purūs kraštai po kontūravimo', briaunoti) cv2.waitKey (0)
Spausdindami kontūro rinkmeną sužinokite, iš ko susideda kontūrai
spausdinti (kontūrai) spausdinti ('Rastų kontūrų skaičius =' + str (len (kontūrai)))
Nubrėžkite visus kontūrus
# naudokite -1 kaip 3 parametrą, norėdami nubrėžti visus kontūrus cv2.drawContours (vaizdas, kontūrai, -1, (0,255,0), 3) cv2.imshow ('kontūrai', vaizdas) cv2.waitKey (0) cv2. destrAllWindows ()
Konsolės išvestis -],],], …,],],]], dtype = int32), masyvas (],],
], …,
],],]], dtype = int32), masyvas (],],], …,],],]], tipo = int32)]
Rastų kontūrų skaičius = 3. Taigi mes radome iš viso tris kontūrus.
Dabar, aukščiau nurodytame kode, mes taip pat išspausdinome kontūro failą , šis failas nurodo, kaip atrodo šie kontūrai, kaip atspausdinta aukščiau konsolės išvestyje.
Pirmiau pateiktame konsolės išvestyje turime matricą, kuri atrodo kaip x, y taškų koordinatės. „OpenCV“ kontūrus saugo sąrašų sąrašuose. Pirmiau minėtą konsolės išvestį galime tiesiog parodyti taip:
CONTOUR 1 CONTOUR 2 CONTOUR 3
], masyvas (], masyvas (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Dabar, kai kontūro faile naudojame ilgio funkciją, ilgis yra lygus 3, tai reiškia, kad tame faile buvo trys sąrašų sąrašai, ty trys kontūrai.
Įsivaizduokite, kad KONTOURAS 1 yra pirmasis tos masyvo elementas, o sąraše yra visų koordinačių sąrašas, o šios koordinatės yra taškai išilgai kontūrų, kuriuos ką tik matėme, kaip žalios stačiakampės dėžutės.
Šioms koordinatėms saugoti yra skirtingi metodai ir jie vadinami aproksimacijos metodais, iš esmės aproksimavimo metodai yra dviejų tipų
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE saugo visą ribinį tašką, tačiau mums nebūtinai reikia visų ribos taškų, jei taškas formuoja tiesią liniją, mums reikia tik tos tiesės pradžios ir pabaigos taškų.
Vietoj to cv2.CHAIN_APPROX_SIMPLE pateikia tik ribojančių kontūrų pradžios ir pabaigos taškus, todėl žymiai efektyviau išsaugoma kontūrų informacija.
_, kontūrai, hierarchija = cv2.findContours (briaunoti, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Ankstesniame kode „ cv2.RETR_EXTERNAL“ yra paieškos režimas, o „ cv2.CHAIN_APPROX_NONE“ yra
aproksimavimo metodas.
Taigi mes sužinojome apie kontūrus ir aproksimacijos metodą. Dabar panagrinėkime hierarchiją ir paieškos režimą.
2. Hierarchija ir paieškos būdas
Priėmimo režimas apibrėžia hierarchiją kontūruose, pvz., Kontūruose, išoriniuose kontūruose arba visuose kontūruose.
Dabar yra keturi paieškos režimai, surūšiuoti pagal hierarchijos tipus.
cv2.RETR_LIST - gauna visus kontūrus.
cv2.RETR_EXTERNAL - gauna tik išorinius arba išorinius kontūrus.
cv2.RETR_CCOMP - viską nuskaito 2 lygių hierarchijoje.
cv2.RETR_TREE - viską nuskaito visoje hierarchijoje.
Hierarchija saugoma tokiu formatu
Dabar pavaizduokime skirtumą tarp pirmųjų dviejų paieškos režimų - cv2.RETR_LIST ir cv2.RETR_EXTERNAL.
import cv2 import numpy kaip np
Leidžia įkelti paprastą vaizdą su 3 juodais langeliais
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
Pilkoji skalė
pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY)
Raskite „Canny Edges“
kraštas = cv2.Canny (pilka, 30.200) cv2.imshow (' canny edge', briaunoti) cv2.waitKey (0)
Kontūrų paieška
#naudokite savo paveikslėlio kopiją, pvz., - edged.copy (), nes radę kontūrus pakeičiame vaizdą # mes turime pridėti _ prieš kontūrus kaip tuščią argumentą dėl atviros cv versijos atnaujinimo _, kontūrai, hierarchija = cv2.findContours (briaunotas, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('purūs kraštai po kontūravimo', briaunoti) cv2.waitKey (0)
Spausdindami kontūro rinkmeną sužinokite, iš ko susideda kontūrai.
spausdinti (kontūrai) spausdinti ('Rastų kontūrų skaičius =' + str (len (kontūrai)))
Nubrėžkite visus kontūrus
# naudokite -1 kaip 3 parametrą, norėdami nubrėžti visus kontūrus cv2.drawContours (vaizdas, kontūrai, -1, (0,255,0), 3) cv2.imshow ('kontūrai', vaizdas) cv2.waitKey (0) cv2. destrAllWindows
import cv2 import numpy kaip np
Leidžia įkelti paprastą vaizdą su 3 juodais langeliais
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
Pilkoji skalė
pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY)
Raskite sugedusius kraštus
kraštas = cv2.Canny (pilka, 30.200) cv2.imshow (' canny edge', briaunoti) cv2.waitKey (0)
Kontūrų radimas
#naudokite savo atvaizdo kopiją, pvz., - edged.copy (), nes radę kontūrus pakeičiame vaizdą # mes turime pridėti _ prieš kontūrus kaip tuščią argumentą dėl atviros cv versijos atnaujinimo _, kontūrai, hierarchija = cv2.findContours (briaunotas, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('purūs kraštai po kontūravimo', briaunoti) cv2.waitKey (0)
Spausdindami kontūro rinkmeną sužinokite, iš ko susideda kontūrai.
spausdinti (kontūrai) spausdinti ('Rastų kontūrų skaičius =' + str (len (kontūrai)))
Nubrėžkite visus kontūrus
# naudokite -1 kaip 3 parametrą, norėdami nubrėžti visus kontūrus cv2.drawContours (vaizdas, kontūrai, -1, (0,255,0), 3) cv2.imshow ('kontūrai', vaizdas) cv2.waitKey (0) cv2. destrAllWindows ()
Taigi pademonstravę aukščiau pateiktus kodus, aiškiai matėme skirtumą tarp cv2.RETR_LIST ir cv2.RETR_EXTERNNAL , cv2.RETR_EXTERNNAL atsižvelgiama tik į išorinius kontūrus, o į vidinius kontūrus neatsižvelgiama.
Nors cv2.RETR_LIST taip pat atsižvelgiama į vidinius kontūrus.
3. Kontūrų priartinimas ir jų išgaubto korpuso radimas
Apytiksliai kontūrus kontūro forma priartina prie kitos kontūro formos, kuri gali būti ne tiek panaši į pirmąją kontūro formą.
Norėdami apytiksliai naudoti „ openCV“ funkciją „kbPolyDP“, kuri paaiškinta toliau
cv2.approxPolyDP (kontūras, aproksimacijos tikslumas, uždaras)
Parametrai:
- Kontūras - tai individualus kontūras, kurį norime priartinti.
- Priartinimo tikslumas - svarbus parametras nustatant aproksimacijos tikslumą, maža vertė suteikia tikslią apytikslę vertę, didelės vertės suteikia daugiau bendros informacijos. Gera nykščio taisyklė yra mažesnė nei 5% kontūro perimetro.
- Uždaryta - Bulio reikšmė, nurodanti, ar apytikslis kontūras gali būti atviras ar uždaras.
Pabandykime apytiksliai apibūdinti paprastą namo figūrą
import numerį kaip np importuoti cv2
Įkelkite vaizdą ir pasilikite kopiją
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('originalus paveikslėlis', orig_image) cv2.waitKey (0)
Pilkai atvaizduokite ir padarykite binarizuotą vaizdą
pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY) ret, kulta = cv2. riba (pilka, 127,255, cv2.THRESH_BINARY_INV)
Raskite kontūrus
_, kontūrai, hierarchija = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Kartokite kiekvieną kontūrą ir apskaičiuokite jų ribotąjį stačiakampį
c kontūruose : x, y, w, h = cv2. ribojantis. Tiesus (c) cv2 stačiakampis (orig_image, (x, y), (x + w, y + h), (0,0, 255), 2) cv2.imshow ('Bounding rect', orig_image) cv2.waitKey (0)
Kartokite kiekvieną kontūrą ir apskaičiuokite apytikslį kontūrą
c kontūruose:
#suskaičiuoti tikslumą procentais nuo kontūro perimetro tikslumo = 0,03 * cv2.arcLength (c, True) apytiksliai = cv2.approxPolyDP (c, tikslumas, True) cv2.drawContours (vaizdas,, 0, (0,255,0), 2) cv2.imshow ('Apytiksliai polyDP', vaizdas) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Išgaubtas korpusas
Išgaubtas korpusas iš esmės yra išoriniai kraštai, vaizduojami brėžiant linijas per tam tikrą figūrą.
Tai gali būti mažiausias daugiakampis, kuris gali tilpti aplink patį objektą.
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('star.jpg') pilkas = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY) cv2.imshow ('originalus vaizdas', vaizdas) cv2.waitKey (0)
Sumažinkite vaizdą
ret, kulti = cv2. slenkstis (pilka, 176 255,0)
Raskite kontūrus
_, kontūrai, hierarchija = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Rūšiuoti kontūrus pagal plotą ir tada pašalinti didžiausią rėmo kontūrą
n = len (kontūrai) -1 kontūrai = rūšiuojami (kontūrai, raktas = cv2.contourArea, reverse = False)
Kartokite per kontūrus ir traukite išgaubtą korpusą
c kontūruose:
korpusas = cv2.convexHull (c) cv2.drawContours (vaizdas,, 0, (0,255,0), 2) cv2.imshow ('išgaubtas korpusas, vaizdas) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Kontūro derinimas pagal formas
cv2.matchShapes (kontūro šablonas, kontūro metodas, metodo parametras)
Rezultatas - atitikties vertė (mažesnė reikšmė reiškia artimesnę atitiktį)
kontūro šablonas - tai yra mūsų atskaitos kontūras, kurį bandome rasti naujame paveikslėlyje.
kontūras - individualus kontūras, kurį tikriname.
Metodas - kontūro derinimo tipas (1,2,3).
metodo parametras - palikite ramybėje kaip 0.0 (nenaudojamas „Python Opencv“)
import cv2 import numpy kaip np
Įkelkite formos šabloną arba nuorodos vaizdą
template = cv2.imread ('star.jpg', 0) cv2.imshow ('template', template) cv2.waitKey (0)
Įkelkite tikslinį vaizdą su formomis, kurias bandome suderinti
target = cv2.imread ('shapestomatch.jpg') pilka = cv2.cvtColor (target, cv2.COLOR_BGR2GRAY)
Prieš naudodami „ cv2.findContours“, pirmiausia nustatykite abu vaizdus
ret, thresh1 = cv2.threshold (šablonas, 127,255,0) ret, thresh2 = cv2.threshold (pilka, 127,255,0)
Šablone raskite kontūrus
_, contours, hierarhy = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # mums reikia rūšiuoti kontūrus pagal plotą, kad galėtume pašalinti didžiausią kontūrą
Vaizdo kontūras
sorted_contours = sorted (contours, key = cv2.contourArea, reverse = True) # išgauname antrą pagal dydį kontūrą, kuris bus mūsų šablono kontūras. tempelate_contour = contours #extract contours from the second target image _, contours, hierarchy = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) už c kontūrų: #iterate per kiekvieną kontūru tikslinės vaizdo ir naudojimo cv2.matchShape palyginti krumpliastiebio tipo įrankio profilio atitikimo = cv2.matchShapes (tempelate_contour, c, 1,0.0) spausdinimo ("atitiktis") # jei atitikties vertė yra mažesnė nei 0,15, jei atitiktis <0,16: artimiausias_kontūras = c kitas: artimiausias_kontūras = cv2.drawContours (taikinys,, - 1, (0,255,0), 3) cv2.imshow ('išvestis', taikinys) cv2.waitKey (0) cv2.destroyAllWindows ()
Pulto išvestis -
0.16818605122199104
0.19946910256158912
0.18949760627309664
0.11101058276281539
Yra trys skirtingi metodai su skirtingomis matematikos funkcijomis, mes galime eksperimentuoti su kiekvienu metodu, tiesiog pakeisdami cv2.matchShapes (tempelate_contour, c, 1, 0.0) metodo reikšmes, kurios skiriasi nuo 1,2 iki 3, kiekvienai reikšmei gausite skirtingą atitiktį reikšmės konsolės išvestyje.
6. Formų identifikavimas (apskritimas, stačiakampis, trikampis, kvadratas, žvaigždė)
„OpenCV“ taip pat gali būti naudojamas automatiškai aptikti įvairių tipų figūras iš vaizdo. Naudodami žemiau esantį kodą, iš vaizdo galėsime nustatyti apskritimą, stačiakampį, trikampį, kvadratą ir žvaigždes.
import cv2 import numpy kaip np
Įkelkite ir tada pilkos spalvos vaizdus
image = cv2.imread ('shape.jpg') pilka = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('formų identifikavimas', vaizdas) cv2.waitKey (0) ret, thresh = cv2.threshold (pilkas, 127,255,1)
Ištraukite kontūrus
_, kontūrai, hierarchija = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Dėl cnt kontūruose:
Gaukite apytikslius daugiakampius apytiksliai = cv2.approxPolyDP (cnt, 0,01 * cv2.arcLength (cnt, True), True), jei len (apytiksliai) == 3: shape_name = "Trikampis" cv2.drawContours (vaizdas,, 0, (0,255, 0), - 1)
raskite kontūro centrą, kad tekstas būtų centre
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (paveikslėlis, formos pavadinimas, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (apytiksliai) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M)
Patikrinkite, ar tas keturkampis daugiakampis yra kvadratas ar stačiakampis
# cv2.boundingRect grąžina kairįjį plotį ir aukštį pikseliais, pradedant nuo viršutinio # kairio kampo, jei kvadratas būtų maždaug toks pat, jei abs (wh) <= 3: shape_name = "square" #find kontūro centras, kad įdėtumėte tekstą centre 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" # suraskite kontūro centrą, kad įdėtumėte tekstą į cv2.drawContours (vaizdas,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (vaizdas, formos_pavadinimas, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (apytiksliai) == 10: formos_pavadinimas = „žvaigždė“ cv2.drawContours (vaizdas,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (vaizdas, formos_pavadinimas, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (apytiksliai)> = 15: shape_name = 'apskritimas' cv2.drawContours (vaizdas,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (paveikslėlis, formos_vardas, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow („formų identifikavimas“, vaizdas) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Linijos aptikimas
Linijos aptikimas yra labai svarbi „ OpenCV“ sąvoka ir daug žadanti naudoti realiame pasaulyje. Autonominiai automobiliai naudoja linijų aptikimo algoritmus juostoms ir keliams aptikti.
Linijos aptikime mes nagrinėsime du algoritmus,
- Hough linijos algoritmas
- Probalistinis Hougho linijos algoritmas.
Galbūt prisiminė linijos vaizdą iš vidurinės mokyklos matematikos su lygtimi y = mx + c.
Tačiau „OpenCV“ linijoje vaizduojamas kitas būdas
Aukščiau pateikta lygtis ρ = xcosӨ + ysincosӨ yra OpenCV linijos atvaizdavimas, kur ρ yra statmenas linijos atstumas nuo pradžios, o Ө yra kampas, kurį sudaro šios tiesės normalus pradžia (matuojamas radianais, kur 1pi radianai / 180 = 1 laipsnis).
Linijos aptikimo funkcija „OpenCV“ pateikiama kaip
cv2.HoughLines (binarizuotas vaizdas, ρ tikslumas, Ө tikslumas, slenkstis), kur slenkstis yra minimalus balsas, kad jis būtų laikomas linija.
Dabar aptikime langelio atvaizdo eilutes naudodamiesi opo Hough linijų funkcija.
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('box.jpg')
Išgaunamos pilkos spalvos ir kannyro kraštai
pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY) kraštai = cv2.Canny (pilka, 100,170, diafragmos dydis = 3)
Vykdykite „Hough“ linijas naudodami 1 pikselio tikslumą
#theta tikslumas (np.pi / 180), kuris yra 1 laipsnio # linijos slenkstis, nustatytas į 240 (taškų skaičius tiesėje) linijų = cv2. „oughLines “(kraštai, 1, np.pi / 180, 240) # kartojame per kiekvieną eilutę ir konvertuokite į formatą , kurio reikalauja cv2.lines (t. y. reikalaujant galinių taškų) i diapazone (0, len (eilutės)): rho, teta eilutėse: a = np.cos (teta) b = np.sin (teta) 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 (paveikslėlis, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('linijos', paveikslėlis) cv2.waitKey (0) cv2.destroyAllWindows ()
Dabar pakartokime aukščiau tiesių aptikimą su kitu tikimybinės Hough linijos algoritmu.
Tikimybinės Hough linijos idėja yra surinkti atsitiktinį taškų pogrupį, kurio pakanka linijai aptikti.
Tikimybinės Hough linijos „OpenCV“ funkcija pateikiama kaip cv2. „HoughLinesP“ (binarizuotas vaizdas, ρ tikslumas, Ө tikslumas, slenkstis, minimalus linijos ilgis, didžiausias linijos tarpas)
Dabar aptikime langelio linijas tikimybinių Hough linijų pagalba.
import cv2 import numpy kaip np
Išgaunami pilkų atspalvių ir purūs kraštai
image = cv2.imread ('box.jpg') pilka = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) kraštai = cv2.Canny (pilka, 50,150, apertureSize = 3) #vėl mes naudojame tuos pačius rho ir teta tikslumus #wowever, mes nurodyti minimalų balsas yra (pTS išilgai linijos) iš 100 #and minutės linijos ilgis 5 pikselių ir max skirtumo tarp 10 pikselių linijų linijų = cv2.HoughLinesP (kraštų, 1, np.pi / 180,100,100,10) už i diapazone (0, len (eilutės)): x1, y1, x2, y2 eilutėse: cv2.line (vaizdas, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('probalistic hough lines', image) cv2.waitKey (0) cv2.destroyAllWindows
8. Lėkštės aptikimas
„Blobs“ gali būti apibūdinta kaip sujungtų taškų grupė, turinti bendrą nuosavybę. „OpenCV blob detector“ naudojimo metodas aprašytas šioje schemoje.
Piešdami pagrindinius taškus, mes naudojame cv2.drawKeypoints, kuriame pateikiami šie argumentai.
cv2.drawKeypoints (įvesties vaizdas, raktiniai taškai, blank_output_array, spalva, vėliavos)
kur vėliavose galėtų būti
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
ir tuščias čia yra beveik niekas, tik po vieną nulių matricą
Dabar atlikime saulėgrąžų atvaizdą, kai dėmės būtų centrinės gėlės dalys, nes jos yra paplitusios tarp visų žiedų.
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE)
Nustatykite detektorių su numatytaisiais parametrais
detektorius = cv2.SimpleBlobDetector_create ()
Aptikti blobs
raktiniai taškai = detector.detect (vaizdas)
Nubrėžkite aptiktas dėmeles raudonais apskritimais
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS įsitikinkite, kad apskritimo dydis atitinka tuščios vietos dydį = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,255), cv2.SDWW
Rodyti pagrindinius taškus
cv2.imshow ('blobs', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()
Nors kodas veikia gerai, tačiau kai kurios dėmės yra praleistos dėl nevienodo gėlių dydžio, nes priekyje esančios gėlės yra didelės, palyginti su gėlėmis pabaigoje.
9. Blobs filtravimas - apskritimų ir elipsių skaičiavimas
Mes galime naudoti parametrus filtruoti dėmeles pagal jų formą, dydį ir spalvą. Norėdami naudoti parametrus su dėmės detektoriumi, mes naudojame „OpenCV“ funkciją
cv2.SimpleBlobDetector_Params ()
Matysime, kaip dėmės filtruojamos pagal šiuos keturis toliau išvardytus parametrus:
Plotas
params.filterByArea = True / False params.minArea = pikseliai params.maxArea = pikseliai
Apskritimas
params.filterByCircularity = True / False params.minCircularity = 1 yra tobulas, 0 yra priešingas
Išgaubtumas - dėmės plotas / išgaubto korpuso plotas
params.filterByConvexity = True / False params.minConvexity = Plotas
Inercija
params.filterByInertia = True / False params.minInertiaRatio = 0,01
Dabar pabandykime filtruoti dėmeles pagal aukščiau nurodytus parametrus
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('blobs.jpg') cv2.imshow ('originalus vaizdas', paveikslėlis) cv2.waitKey (0)
Inicializuokite detektorių naudodami numatytuosius parametrus
detektorius = cv2.SimpleBlobDetector_create ()
Aptikti blobs
raktiniai taškai = detector.detect (vaizdas)
Ant mūsų atvaizdo nupieškite raudonas apskritimus
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "visas blobų skaičius " + [len (pagrindiniai taškai)] cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0, 255), 2)
Rodyti vaizdą su „BLOB“ pagrindiniais taškais
cv2.imshow ('blobas naudojant numatytuosius parametrus', blobs) cv2.waitKey (0)
Nustatykite filtravimo parametrus
#initialize parametro nustatymas naudojant cv2.SimpleBlobDetector parametrai = cv2.SimpleBlobDetector_Params ()
Nustatykite ploto filtravimo parametrus
params.filterByArea = Tikrieji params.minArea = 100
Nustatykite žiediškumo filtravimo parametrus
params.filterByCircularity = Tikrieji params.minCircularity = 0,9
Nustatykite išgaubtumo filtravimo parametrą
params.filterByConvexity = Klaidingi params.minConvexity = 0,2
Nustatykite inercijos filtravimo parametrą
params.filterByInertia = Tikrosios params.minInertiaRatio = 0,01
Sukurkite detektorių su parametru
detektorius = cv2.SimpleBlobDetector_create (parametrai)
Aptikti blobs
raktiniai taškai = detector.detect (vaizdas)
Ant vaizdų nupieškite burbuoles kaip raudonus apskritimus
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 = "bendras apskrito blobs skaičius str (len (pagrindiniai taškai)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Rodyti dėmeles
cv2.imshow („žiedinių dėmių filtravimas“, „BLOB“) cv2.waitKey (0) cv2.destroyAllWindows ()
Taigi taip galima segmentuoti vaizdus naudojant „Python-OpenCV“. Norėdami gerai suprasti kompiuterio regėjimą ir „OpenCV“, perskaitykite ankstesnius straipsnius („Pradėkite naudoti„ Python OpenCV “ir„ Image Manipulation “programose„ Python OpenCV “ir galėsite sukurti ką nors puikaus naudodami„ Computer Vision “.