- 1. Szegmentálás és kontúrok
- 2. Hierarchia és visszakeresési mód
- 3. A kontúrok közelítése és domború hajótestük megkeresése
- 4. Convex Hull
- 5. Kontúr illesztése alakzatok szerint
- 6. Alakzatok azonosítása (kör, téglalap, háromszög, négyzet, csillag)
- 7. Vonal detektálása
- 8. A folt észlelése
- 9. A foltok szűrése - körök és ellipszisek számlálása
Az előző oktatóanyagokban az OpenCV-t használtuk az alapvető képfeldolgozáshoz, és néhány előzetes képszerkesztő műveletet elvégeztünk. Mint tudjuk, az OpenCV egy Open Source Commuter Vision Library, amely C ++, Python és Java interfészekkel rendelkezik, és támogatja a Windows, Linux, Mac OS, iOS és Android rendszereket. Így könnyen telepíthető a Raspberry Pi-be Python és Linux környezettel. Az OpenCV-vel és a csatlakoztatott kamerával rendelkező Raspberry Pi sok valós idejű képfeldolgozó alkalmazás létrehozására használható, például Arcfelismerés, Arczár, Objektumkövetés, Autó rendszámtábla-felismerés, Otthoni biztonsági rendszer stb. Ebben a bemutatóban megtanuljuk, hogyan kell csinálni kép szegmentálása OpenCV használatával. Az alábbiakban felsoroljuk azokat a műveleteket, amelyeket végre fogunk hajtani:
- Szegmentálás és kontúrok
- Hierarchia és visszakeresési mód
- Körvonalak közelítése és domború hajótestük megtalálása
- Conex Hull
- Kontúr illesztése
- Alakzatok azonosítása (kör, téglalap, háromszög, négyzet, csillag)
- Vonalfelismerés
- Folt észlelése
- A foltok szűrése - a körök és az ellipszisek számlálása
1. Szegmentálás és kontúrok
A kép szegmentálása olyan folyamat, amelynek során a képeket különböző régiókra osztjuk fel. Míg a kontúrok azok a folytonos vonalak vagy görbék, amelyek lekötik vagy lefedik egy objektum teljes határát a képen. És itt a kontúroknak nevezett képszegmentálási technikát fogjuk használni a kép részeinek kivonására.
A kontúrok is nagyon fontosak
- Tárgyfelismerés
- Alakelemzés
És nagyon széles alkalmazási területük van a valós képelemzéstől az orvosi képelemzésig, például az MRI-ben
Tudjuk meg, hogyan lehet a kontúrokat megvalósítani az opencv-ben, négyzetek kontúrjainak kinyerésével.
import cv2 import numpy mint np
Töltsünk be egy egyszerű képet 3 fekete négyzettel
image = cv2.imread ('négyzetek.jpg') cv2.imshow ('bemeneti kép', kép) cv2.waitKey (0)
Szürkeárnyalatos
szürke = cv2.cvtColor (kép, cv2.COLOR_BGR2GRAY)
Keressen kannya széleket
él = cv2.Canny (szürke, 30.200) cv2.imshow (' canny edge', élű) cv2.waitKey (0)
Kontúrok keresése
# használja a kép másolatát, pl. - edged.copy (), mivel a kontúrok keresése megváltoztatja a képet # hozzá kell adnunk a _-t, mielőtt a kontúrok üres argumentumként szerepelnek az OpenCV verzió frissítése miatt _, kontúrok, hierarchia = cv2.findContours (szélezett, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('canny élek kontúrozás után', élekkel) cv2.waitKey (0)
A kontúrfájl kinyomtatása, hogy megismerje a kontúrokat
print (kontúrok) print ('Talált kontúrok száma =' + str (len (kontúrok)))
Rajzolja meg az összes körvonalat
# # -1 a 3. paraméterként az összes kontúr megrajzolásához cv2.drawContours (kép, kontúrok, -1, (0,255,0), 3) cv2.imshow ('kontúrok', kép) cv2.waitKey (0) cv2. destrAllWindows ()
Konzol kimenet -],],], …,],],]], dtype = int32), sor(],],
], …,
],],]], dtype = int32), tömb (],],], …,],],]], dtype = int32)]
A talált kontúrok száma = 3. Tehát összesen három kontúrt találtunk.
Most, a fenti kódban, amellyel a kontúrfájlt is kinyomtattuk , ez a fájl elmondja, hogyan néznek ki ezek a kontúrok, ahogy a fenti konzol kimenetén kinyomtatták.
A fenti konzol kimenetben van egy mátrixunk, amely úgy néz ki, mint x, y pont koordinátái. Az OpenCV a kontúrokat a listák listájában tárolja. Egyszerűen meg tudjuk mutatni a fenti konzol kimenetet az alábbiak szerint:
CONTOUR 1 CONTOUR 2 CONTOUR 3
], tömb (], tömb (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Most, amikor a hosszúságfüggvényt használjuk a kontúrfájlon, a hosszúságot 3-mal kapjuk meg, ez azt jelenti, hogy abban a fájlban három listalista volt, azaz három kontúr.
Most képzeljük el, hogy a CONTOUR 1 az első elem a tömbben, és ez a lista tartalmazza az összes koordinátát, és ezek a koordináták azok a pontok a kontúrok mentén, amelyeket éppen láttunk, zöld téglalap alakú dobozként.
Különböző módszerek vannak ezeknek a koordinátáknak a tárolására, ezeket nevezzük közelítő módszereknek, alapvetően a közelítő módszereknek két típusa van
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
A cv2.CHAIN_APPROX_NONE tárolja az összes határpontot, de nincs szükségünk feltétlenül az összes határpontra, ha a pont egyeneset alkot, akkor csak a kezdő és a végpontra van szükségünk ezen a vonalon.
A cv2.CHAIN_APPROX_SIMPLE ehelyett csak a határoló kontúrok kezdő és végpontját adja meg, az eredmény sokkal hatékonyabb kontúrinformációk tárolása.
_, kontúrok, hierarchia = cv2.findContours (szegélyezett, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
A fenti kód cv2.RETR_EXTERNAL a fogadási módot, míg a cv2.CHAIN_APPROX_NONE van
a közelítési módszer.
Tehát megtanultuk a kontúrokat és a közelítési módszert, most vizsgáljuk meg a hierarchiát és a visszakeresési módot.
2. Hierarchia és visszakeresési mód
A visszakeresési mód a hierarchiát olyan kontúrokban határozza meg, mint al- vagy külső kontúr, vagy az összes kontúr.
Most négy visszakeresési mód van rendezve a hierarchiatípusok szerint.
cv2.RETR_LIST - lekéri az összes kontúrt.
cv2.RETR_EXTERNAL - csak külső vagy külső kontúrokat kap.
cv2.RETR_CCOMP - az összes lekérése egy 2 szintű hierarchiában.
cv2.RETR_TREE - az összes lekérése teljes hierarchiában.
A hierarchiát a következő formátumban tároljuk
Most mutatjuk be az első két visszakeresési mód, a cv2.RETR_LIST és a cv2.RETR_EXTERNAL közötti különbséget.
import cv2 import numpy mint np
Betölthet egy egyszerű képet 3 fekete négyzettel
image = cv2.imread ('négyzetfánk.jpg') cv2.imshow ('bemeneti kép', kép) cv2.waitKey (0)
Szürkeárnyalatos
szürke = cv2.cvtColor (kép, cv2.COLOR_BGR2GRAY)
Keresse meg a Canny Edges-t
él = cv2.Canny (szürke, 30.200) cv2.imshow (' canny edge', élű) cv2.waitKey (0)
Kontúrok keresése
# használja a kép másolatát, pl. - edged.copy (), mivel a kontúrok megkeresése megváltoztatja a képet # hozzá kell adnunk _, mielőtt a kontúrok üres argumentumként szerepelnek a nyitott cv verzió frissítése miatt _, kontúrok, hierarchia = cv2.findContours (szélezett, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('canny élek kontúrozás után', élekkel) cv2.waitKey (0)
A kontúrfájl kinyomtatása, hogy megismerje a kontúrokat.
print (kontúrok) print ('Talált kontúrok száma =' + str (len (kontúrok)))
Rajzolja meg az összes körvonalat
# # -1 a 3. paraméterként az összes kontúr megrajzolásához cv2.drawContours (kép, kontúrok, -1, (0,255,0), 3) cv2.imshow ('kontúrok', kép) cv2.waitKey (0) cv2. destrAllWindows
import cv2 import numpy mint np
Betölthet egy egyszerű képet 3 fekete négyzettel
image = cv2.imread ('négyzetfánk.jpg') cv2.imshow ('bemeneti kép', kép) cv2.waitKey (0)
Szürkeárnyalatos
szürke = cv2.cvtColor (kép, cv2.COLOR_BGR2GRAY)
Keressen kannya széleket
él = cv2.Canny (szürke, 30.200) cv2.imshow (' canny edge', élű) cv2.waitKey (0)
Kontúrok keresése
# használja a kép másolatát, pl. - edged.copy (), mivel a kontúrok megkeresése megváltoztatja a képet # hozzá kell adnunk _, mielőtt a kontúrok üres argumentumként szerepelnek a nyitott cv verzió frissítése miatt _, kontúrok, hierarchia = cv2.findContours (szélezett, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('canny élek kontúrozás után', élekkel) cv2.waitKey (0)
A kontúrfájl kinyomtatása, hogy megismerje a kontúrokat.
print (kontúrok) print ('Talált kontúrok száma =' + str (len (kontúrok)))
Rajzolja meg az összes körvonalat
# # -1 a 3. paraméterként az összes kontúr megrajzolásához cv2.drawContours (kép, kontúrok, -1, (0,255,0), 3) cv2.imshow ('kontúrok', kép) cv2.waitKey (0) cv2. destrAllWindows ()
Tehát a fenti kódok bemutatásával egyértelműen láthattuk a különbséget a cv2.RETR_LIST és a cv2.RETR_EXTERNNAL között , a cv2.RETR_EXTERNNAL-ban csak a külső kontúrokat veszik figyelembe, miközben a belső kontúrokat figyelmen kívül hagyják.
Míg a cv2- ben a RETR_LIST a belső kontúrokat is figyelembe veszi.
3. A kontúrok közelítése és domború hajótestük megkeresése
A kontúrok közelítésében a kontúr alakja közelít egy másik kontúr alakhoz, amely lehet, hogy nem annyira hasonlít az első kontúr formához.
A közelítéshez az openCV kbPolyDP függvényét használjuk, amelyet az alábbiakban ismertetünk
cv2.approxPolyDP (kontúr, közelítési pontosság, zárt)
Paraméterek:
- Kontúr - az az egyéni kontúr, amelyet közelíteni szeretnénk.
- Közelítés Pontosság - fontos paraméter a közelítés pontosságának meghatározásában, a kis érték pontos közelítést ad, a nagy értékek általánosabb információt adnak. A jó hüvelykujjszabály kevesebb, mint a kontúr kerületének 5% -a.
- Zárt - logikai érték, amely megadja, hogy a hozzávetőleges kontúr lehet-e nyitott vagy zárt.
Próbáljunk közelíteni egy ház egyszerű ábrájához
import numpy, mint np import cv2
Töltse be a képet, és őrizzen meg egy példányt
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('eredeti kép', orig_image) cv2.waitKey (0)
Szürkeárnyalatos és binarizálja a képet
szürke = cv2.cvtColor (kép, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.küszöb (szürke, 127.255, cv2.THRESH_BINARY_INV)
Keresse meg a Kontúrokat
_, kontúrok, hierarchia = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Minden kontúron keresztül iterálj, és számítsd ki a téglalapot
c kontúrokban: x, y, w, h = cv2.korlátozóRect (c) cv2.téglalap (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('Bounding rect', orig_image) cv2.waitKey (0)
Minden kontúron iteráljon, és számítsa ki a kb
c kontúrokban:
# kiszámítja a pontosságot a kontúr kerülete pontosságának százalékában = 0,03 * cv2.arcLength (c, True) kb = cv2.approxPolyDP (c, pontosság, True) cv2.drawContours (kép,, 0, (0,255,0), 2) cv2.imshow ('kb. polyDP', kép) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Convex Hull
A domború hajótest alapvetően a külső élek, amelyeket egy adott ábra felett vonalak rajzolnak.
Ez lehet a legkisebb sokszög, amely elfér az objektum körül.
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)
Küszöbölje a képet
ret, thresh = cv2. küszöb (szürke, 176 255,0)
Keresse meg a kontúrokat
_, kontúrok, hierarchia = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Rendezze a kontúrokat terület szerint, majd távolítsa el a legnagyobb keret kontúrt
n = len (kontúrok) -1 kontúr = rendezve (kontúrok, kulcs = cv2.contourArea, fordított = Hamis)
A kontúrokon keresztül iterálunk és domború hajót húzzunk
c kontúrokban:
hull = cv2.convexHull (c) cv2.drawContours (kép,, 0, (0,255,0), 2) cv2.imshow ('konvex burkolat', kép) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Kontúr illesztése alakzatok szerint
cv2.matchShapes (kontúr sablon, kontúr módszer, metódus paraméter)
Kimenet - egyezési érték (az alacsonyabb érték szorosabb egyezést jelent)
kontúr sablon - Ez a referenciakontúrunk, amelyet új képen próbálunk megtalálni.
kontúr - Az az egyéni kontúr, amely ellen ellenőrizzük.
Módszer - A kontúrillesztés típusa (1,2,3).
metódus paraméter - hagyja békén 0.0-ként (a Python Opencv-ben nem használják)
import cv2 import numpy mint np
Töltse be az alak sablont vagy a referencia képet
template = cv2.imread ('star.jpg', 0) cv2.imshow ('template', template) cv2.waitKey (0)
Töltse be a célképet azokkal az alakzatokkal, amelyeknek próbálunk megfelelni
target = cv2.imread ('shapestomatch.jpg') szürke = cv2.cvtColor (target, cv2.COLOR_BGR2GRAY)
Küszöbölje be mindkét képet először, mielőtt a cv2.findContours alkalmazást használja
ret, thresh1 = cv2. küszöb (sablon, 127,255,0) ret, thresh2 = cv2. küszöb (szürke, 127,255,0)
Keresse meg a kontúrokat a sablonban
_, contours, hierarhy = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # a kontúrokat terület szerint kell rendezni, hogy eltávolítsuk a legnagyobb kontúrt,
Kép vázlata
rendezett_kontúrok = rendezve (kontúrok, kulcs = cv2.contourArea, fordított = Igaz) # kivonjuk a második legnagyobb kontúrt, amely a sablonunk lesz. tempelate_contour = kontúrok # kivonjuk a kontúrokat a második célképből _, kontúrok, hierarchia = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) a C kontúrok: #iterate keresztül minden kontúrt a kiválasztott képet és használata cv2.matchShape összehasonlítani a kontúrral match = cv2.matchShapes (tempelate_contour, c, 1,0.0) print ("egyezés") # Ha az egyezés értéke kevesebb, mint 0,15, ha az egyezés <0,16: legközelebbi_kontúr = c más: legközelebbi_kontúr = cv2.drawContours (cél,, - 1, (0,255,0), 3) cv2.imshow ('kimenet',cél) cv2.waitKey (0) cv2.destroyAllWindows ()
Konzol kimenet -
0.16818605122199104
0.19946910256158912
0.18949760627309664
0,11101058276281539
Három különböző módszer létezik, különböző matematikai funkciókkal. Kísérletezhetünk az egyes módszerekkel, csak kicserélve a cv2.matchShapes (tempelate_contour, c, 1, 0.0) módszer értékeit, amelyek 1,2 és 3 között változnak, minden egyes értékhez más egyezést kap értékek a konzol kimenetében.
6. Alakzatok azonosítása (kör, téglalap, háromszög, négyzet, csillag)
Az OpenCV arra is használható, hogy a képből automatikusan észlelje a különböző típusú alakzatokat. Az alábbi kód használatával felismerhetjük a körből, téglalapból, háromszögből, négyzetből és csillagokat a képből.
import cv2 import numpy mint np
Töltsön be, majd szürkeárnyalatos képeket
image = cv2.imread ('formas.jpg') szürke = cv2.cvtColor (kép, cv2.COLOR_BGR2GRAY) cv2.imshow ('alakzatok azonosítása', kép) cv2.waitKey (0) ret, thresh = cv2.küszöb (szürke, 127,255,1)
Kihúzza a kontúrokat
_, kontúrok, hierarchia = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Kontúrokban lévő cnt esetén:
Hozzávetőleges sokszögek beszerzése kb = cv2.approxPolyDP (cnt, 0,01 * cv2.arcLength (cnt, True), True), ha len (kb.) == 3: alaknév = "Háromszög" cv2.drawContours (kép,, 0, (0,255, 0), - 1)
keresse meg a kontúrközpontot a szöveg középre helyezéséhez
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (kép, alaknév, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (kb.) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M)
Ellenőrizze, hogy ez a négy oldalú sokszög négyzet vagy téglalap alakú-e
# cv2.boundingRect adja vissza a bal szélességet és magasságot pixelben, a felső # bal saroktól kezdve , a négyzet esetében nagyjából azonos lenne, ha az abs (wh) <= 3: shape_name = "négyzet" # keresse meg a kontúrközpontot a szöveg elhelyezéséhez center cv2.drawContours (kép,, 0, (0,125,255), - 1) cv2.putText (kép, alaknév, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) else: shape_name = "Reactangle" # keresse meg a kontúrközpontot a szöveg elhelyezéséhez a cv2.drawContours (kép,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (kép, alaknév, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (kb.) == 10: alaknév = 'csillag' cv2.drawContours (kép,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (kép, alaknév, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (kb.)> = 15: shape_name = 'kör' cv2.drawContours (kép,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (kép, alaknév, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('formák azonosítása', kép) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Vonal detektálása
A vonalfelismerés nagyon fontos fogalom az OpenCV-ben, és ígéretes felhasználása a való világban. Az autonóm autók vonalvezetési algoritmusokat használnak a sávok és utak felderítésére.
A vonalfelismerésben két algoritmussal fogunk foglalkozni,
- Hough-vonal algoritmus
- Probalisztikus Hough-vonal algoritmus.
Emlékezhetett a középiskolai matematika vonalának reprezentációjára az y = mx + c egyenlettel .
Ugyanakkor az OpenCV sorban egy másik mód van ábrázolva
A ρ = xcosӨ + ysincosӨ feletti egyenlet az egyenes OpenCV-ábrázolása, ahol ρ a merőleges vonal távolsága az origótól és Ө az a szög, amelyet ennek a vonalnak az origójához viszonyított normális alakít ki (radiánban mérve, ahol 1pi radián / 180 = 1 fok).
A vonal detektálására szolgáló OpenCV funkció a következő
cv2.HoughLines (bináris kép, ρ pontosság, Ө pontosság, küszöb), ahol a küszöb minimális szavazat ahhoz, hogy vonalnak tekintsük.
Most észleljünk egy doboz képének vonalait az opencv Hough sorfüggvényének segítségével.
import cv2 import numpy as np image = cv2.imread ('box.jpg')
Szürkeárnyalatos és kannyás élek kivonva
szürke = cv2.cvtColor (kép, cv2.COLOR_BGR2GRAY) élek = cv2.Canny (szürke, 100,170, apertureSize = 3)
Futtassa a Hough vonalakat 1 pixel rho pontossággal
A (np.pi / 180) 1 fokos theta pontossága #vonal küszöbérték 240-re (a vonalon lévő pontok száma) van beállítva = cv2. HoughLines (élek, 1, np.pi / 180, 240) # iterálunk minden soron át, és konvertáljon a cv2.lines által megkövetelt (azaz végpontokat igénylő) formátumra i tartományban (0, len (vonalak)): rho esetében theta sorokban: 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 (kép, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('hough vonalak', image) cv2.waitKey (0) cv2.destroyAllWindows ()
Most ismételjük meg a fenti vonalletektálást a valószínűségi Hough-vonal más algoritmusával.
A valószínűségi Hough-vonal mögött álló ötlet az, hogy véletlenszerű ponthalmazt vesz fel, amely elegendő a vonal detektálásához.
A valószínűségi Hough-vonal OpenCV funkciója cv2- ként van ábrázolva. HoughLinesP (bináris kép, ρ pontosság, Ө pontosság, küszöb, minimális vonalhossz, maximális sorköz)
Most észleljük a dobozvonalakat a valószínűségi Hough vonalak segítségével.
import cv2 import numpy mint np
Szürkeárnyalatos és kannyás élek Kivonva
image = cv2.imread ('box.jpg') szürke = cv2.cvtColor (kép, cv2.COLOR_BGR2GRAY) élek = cv2.Canny (szürke, 50,150, apertureSize = 3) # ismét ugyanazokat a rho és theta pontosságokat használjuk # azonban, megadjuk a minimális szavazás (PTS vonal mentén) a 100 # és min vonal hossza 5 pixel és max rés a sorok között a 10 pixelek vonalak = cv2.HoughLinesP (élek, 1, np.pi / 180,100,100,10) i tartományban (0, len (vonalak)): x1, y1, x2, y2 esetén sorokban: cv2.line (kép, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('probalistic hough lines', image) cv2.waitKey (0) cv2.destroyAllWindows
8. A folt észlelése
A blobokat összekapcsolt pixelek csoportjaként írhatjuk le, amelyek mind közös tulajdonsággal rendelkeznek. Az OpenCV blobdetektor használatának módszerét ezen a folyamatábrán keresztül ismertetjük.
A kulcspontok megrajzolásához a cv2.drawKeypoints-t használjuk, amely a következő argumentumokat veszi fel.
cv2.drawKeypoints (beviteli kép, kulcspontok, blank_output_array, szín, zászlók)
hol lehet a zászlókban
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
és üres itt nagyjából semmi, csak egyenként a nullák mátrixa
Most végezzük el a folt észlelését egy napraforgó képen, ahol a foltok a virág központi részei lennének, mivel ezek az összes virág között gyakoriak.
import cv2 import numpy as np image = cv2.imread ('Napraforgók.jpg', cv2.IMREAD_GRAYSCALE)
Állítsa be az érzékelőt alapértelmezett paraméterekkel
detektor = cv2.SimpleBlobDetector_create ()
Foltok észlelése
kulcspontok = detektor.detekt (kép)
Rajzolja az észlelt foltokat piros körökként
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS biztosítja, hogy a # kör mérete megfeleljen a blob blank = np.zeros ((1,1)) blobok méretének = cv2.drawKeypoints (kép, kulcspontok, üres, (0,255,255), 0,255,255), cv2.DRAW
Kulcspontok megjelenítése
cv2.imshow ('foltok', foltok) cv2.waitKey (0) cv2.destroyAllWindows ()
Annak ellenére, hogy a kód jól működik, de néhány folt hiányzik az egyenetlen virágméretek miatt, mivel az elülső virágok nagyok, mint a végén lévő virágok.
9. A foltok szűrése - körök és ellipszisek számlálása
Paramétereket használhatunk a foltok formájuk, méretük és színük szerinti szűrésére. A blob detektorral történő paraméterek használatához az OpenCV funkcióját használjuk
cv2.SimpleBlobDetector_Params ()
Látni fogjuk a foltok szűrését főleg az alább felsorolt négy paraméter alapján:
Terület
params.filterByArea = Igaz / Hamis params.minArea = képpontok params.maxArea = képpontok
Köralakúság
params.filterByCircularity = Igaz / Hamis params.minCircularity = 1 tökéletes, 0 ellentétes
Konvexitás - a folt / a domború hajótest területe
params.filterByConvexity = Igaz / Hamis params.minConvexity = Terület
Tehetetlenség
params.filterByInertia = Igaz / Hamis params.minInertiaRatio = 0,01
Most próbáljuk meg a foltokat a fent említett paraméterek szerint szűrni
import cv2 import numpy as np image = cv2.imread ('blobs.jpg') cv2.imshow ('original image', image) cv2.waitKey (0)
Inicializálja az érzékelőt az alapértelmezett paraméterek használatával
detektor = cv2.SimpleBlobDetector_create ()
Foltok észlelése
kulcspontok = detektor.detekt (kép)
Rajzoljon foltokat a képünkre piros körként
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 = " stroblek száma összesen" [len (kulcspontok)] cv2.putText (foltok, szöveg, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0, 255), 2)
Kép megjelenítése blob kulcspontokkal
cv2.imshow ('blob alapértelmezett paramétereket használva', blobs) cv2.waitKey (0)
Állítsa be a szűrési paramétereket
#initialize paraméterbeállítás a cv2 használatával. SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()
Területszűrési paraméterek beállítása
params.filterByArea = Igaz params.minArea = 100
Állítsa be a körkörösség szűrési paramétereit
params.filterByCircularity = Valódi params.minCircularity = 0,9
Konvexitás szűrési paraméter beállítása
params.filterByConvexity = Hamis params.minConvexity = 0,2
Állítsa be a tehetetlenségi szűrési paramétert
params.filterByInertia = Valódi params.minInertiaRatio = 0,01
Hozzon létre detektort paraméterrel
detektor = cv2.SimpleBlobDetector_create (paraméterek)
Foltok észlelése
kulcspontok = detektor.detekt (kép)
Rajzoljon foltokat a képekre piros körökként
blank = np.zeros ((1,1)) blob = cv2.drawKeypoints (kép, kulcspontok, üres, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "körkörös foltok száma összesen" str (len (kulcspontok)) cv2.putText (foltok, szöveg, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Foltok megjelenítése
cv2.imshow ('körkörös foltok szűrése', foltok) cv2.waitKey (0) cv2.destroyAllWindows ()
Tehát a képszegmentálás így végezhető el a Python-OpenCV-ben. A számítógépes látás és az OpenCV alábecsülése érdekében olvassa el a korábbi cikkeket (A Python OpenCV és a Python OpenCV képmanipulációinak kezdete, és a Computer Vision segítségével valami jót készíthet.