- 1. Сегментиране и контури
- 2. Йерархия и режим на извличане
- 3. Апроксимиране на контурите и намиране на изпъкналия им корпус
- 4. Изпъкнал корпус
- 5. Съвпадащ контур по форми
- 6. Идентифициране на фигури (кръг, правоъгълник, триъгълник, квадрат, звезда)
- 7. Откриване на линии
- 8. Откриване на петна
- 9. Филтриране на петна - броене на кръгове и елипси
В предишните уроци използвахме OpenCV за основна обработка на изображения и направихме някои операции за предварително редактиране на изображения. Както знаем, OpenCV е Open Source Commuter Vision Library, която има интерфейси C ++, Python и Java и поддържа Windows, Linux, Mac OS, iOS и Android. Така че може лесно да се инсталира в Raspberry Pi с Python и Linux среда. А Raspberry Pi с OpenCV и свързана камера може да се използва за създаване на много приложения за обработка на изображения в реално време, като разпознаване на лица, заключване на лица, проследяване на обекти, откриване на регистрационния номер на автомобил, система за домашна сигурност и т.н. В този урок ще научим как да правим сегментиране на изображения с помощта на OpenCV. Операциите, които ще извършим, са изброени по-долу:
- Сегментиране и контури
- Йерархия и режим на извличане
- Апроксимиране на контури и намиране на изпъкналия им корпус
- Конекс Хъл
- Съвпадащ контур
- Идентифициране на фигури (кръг, правоъгълник, триъгълник, квадрат, звезда)
- Откриване на линия
- Откриване на петна
- Филтриране на петна - броене на кръгове и елипси
1. Сегментиране и контури
Сегментирането на изображения е процес, чрез който разделяме изображенията на различни региони. Докато контурите са непрекъснатите линии или криви, които ограничават или покриват пълната граница на обект в изображение. И тук ще използваме техниката за сегментиране на изображения, наречена контури, за да извлечем частите от изображението.
Също така контурите са много важни в
- Откриване на обект
- Анализ на формата
И те имат много широко поле на приложение от анализ на изображението в реалния свят до анализ на медицински изображения, като при ЯМР
Нека да знаем как да прилагаме контури в opencv, като извличаме контури от квадрати.
import cv2 import numpy като np
Нека заредим просто изображение с 3 черни квадрата
image = cv2.imread ('squares.jpg') cv2.imshow ('входно изображение', изображение) cv2.waitKey (0)
Сива скала
сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GREY)
Намерете умели ръбове
edged = cv2.Canny (сиво, 30,200 ) cv2.imshow ('canny ръбове', Edged) cv2.waitKey (0)
Намиране на контури
# използвайте копие на вашето изображение, например - edged.copy (), тъй като намирането на контури променя изображението # трябва да добавим _, преди контурите като празен аргумент поради надстройка на версията на OpenCV _, contours, hierarchy = cv2.findContours (Edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('canny ръбове след контур ', Edged) cv2.waitKey (0)
Печат на контурния файл, за да се знае от какви контури се състои
print (контури) print ('Намерени номера на контури =' + str (len (контури)))
Начертайте всички контури
#use -1 като 3-ти параметър за изчертаване на всички контури cv2.drawContours (изображение, контури, -1, (0,255,0), 3) cv2.imshow ('контури', изображение) cv2.waitKey (0) cv2. Унищожи всичкиWindows ()
Конзолен изход -],],], …,],],]], dtype = int32), масив (],],
], …,
],],]], dtype = int32), масив (],],], …,],],]], dtype = int32)]
Брой намерени контури = 3. Така че открихме общо три контура.
Сега, в горния код, който също бяхме отпечатали с контурния файл , този файл разказва как изглеждат тези контури, както е отпечатано в изхода на горната конзола.
В горния изход на конзолата имаме матрица, която изглежда като координати на точки x, y. OpenCV съхранява контури в списъци със списъци. Можем просто да покажем горния изход на конзолата, както следва:
КОНТУР 1 КОНТУР 2 КОНТУР 3
], масив (], масив (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Сега, когато използваме функцията за дължина на контурен файл, получаваме дължината, равна на 3, това означава, че в този файл имаше три списъка със списъци, т.е. три контура.
Сега си представете CONTOUR 1 е първият елемент в този масив и този списък съдържа списък на всички координати и тези координати са точките по контурите, които току-що видяхме, като зелените правоъгълни кутии.
Съществуват различни методи за съхраняване на тези координати и те се наричат методи за приближение, като в основата си методите за приближение са два вида
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE съхранява цялата гранична точка, но не е задължително да се нуждаем от всички гранични точки, ако точката образува права линия, имаме нужда само от начална и крайна точка на тази линия.
cv2.CHAIN_APPROX_SIMPLE вместо това осигурява само началната и крайната точки на ограничаващите контури, резултатът е много по-ефективно съхранение на контурна информация.
_, контури, йерархия = cv2.findContours (Edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
В горния код cv2.RETR_EXTERNAL е режимът за извличане, докато cv2.CHAIN_APPROX_NONE е
методът на сближаване.
И така, научихме за контурите и метода на сближаване, сега нека изследваме йерархията и режима на извличане.
2. Йерархия и режим на извличане
Режимът за извличане определя йерархията в контури като подконтури, или външен контур или всички контури.
Сега има четири режима на извличане, сортирани по типовете йерархия.
cv2.RETR_LIST - извлича всички контури.
cv2.RETR_EXTERNAL - извлича само външни или външни контури.
cv2.RETR_CCOMP - извлича всички в йерархия от 2 нива.
cv2.RETR_TREE - извлича всички в пълна йерархия.
Йерархията се съхранява в следния формат
Сега нека илюстрираме разликата между първите два режима на извличане, cv2.RETR_LIST и cv2.RETR_EXTERNAL.
import cv2 import numpy като np
Позволява да заредите просто изображение с 3 черни квадрата
image = cv2.imread ('square donut.jpg') cv2.imshow ('входно изображение', изображение) cv2.waitKey (0)
Сива скала
сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GREY)
Намерете Canny Edges
edged = cv2.Canny (сиво, 30,200 ) cv2.imshow ('canny ръбове', Edged) cv2.waitKey (0)
Намиране на контури
# използвайте копие на вашето изображение, например - edged.copy (), тъй като намирането на контури променя изображението # трябва да добавим _, преди контурите като празен аргумент поради надграждане на отворената cv версия _, contours, hierarchy = cv2.findContours (Edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow („остри ръбове след контуриране“, кант) cv2.waitKey (0)
Печат на контурния файл, за да се знае от какви контури се състои.
print (контури) print ('Намерени номера на контури =' + str (len (контури)))
Начертайте всички контури
#use -1 като 3-ти параметър за изчертаване на всички контури cv2.drawContours (изображение, контури, -1, (0,255,0), 3) cv2.imshow ('контури', изображение) cv2.waitKey (0) cv2. унищожи всичкиWindows
import cv2 import numpy като np
Позволява да заредите просто изображение с 3 черни квадрата
image = cv2.imread ('square donut.jpg') cv2.imshow ('входно изображение', изображение) cv2.waitKey (0)
Сива скала
сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GREY)
Намерете умели ръбове
edged = cv2.Canny (сиво, 30,200 ) cv2.imshow ('canny ръбове', Edged) cv2.waitKey (0)
Намиране на контури
# използвайте копие на вашето изображение, например - edged.copy (), тъй като намирането на контури променя изображението # трябва да добавим _, преди контурите като празен аргумент поради надграждане на отворената cv версия _, contours, hierarchy = cv2.findContours (Edged, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow („остри ръбове след контуриране“, кант) cv2.waitKey (0)
Отпечатване на контурния файл, за да се знае от какви контури се състои.
print (контури) print ('Намерени номера на контури =' + str (len (контури)))
Начертайте всички контури
#use -1 като 3-ти параметър за изчертаване на всички контури cv2.drawContours (изображение, контури, -1, (0,255,0), 3) cv2.imshow ('контури', изображение) cv2.waitKey (0) cv2. Унищожи всичкиWindows ()
Така че чрез демонстрацията на горните кодове можем ясно да видим разликата между cv2.RETR_LIST и cv2.RETR_EXTERNNAL , в cv2.RETR_EXTERNNAL се вземат предвид само външните контури, докато вътрешните контури се игнорират.
Докато в cv2.RETR_LIST се вземат предвид и вътрешните контури.
3. Апроксимиране на контурите и намиране на изпъкналия им корпус
При апроксимиране на контури, контурна форма се апроксимира над друга контурна форма, която може да не е много подобна на първата контурна форма.
За сближаване използваме функцията pribliPolyDP на openCV, което е обяснено по-долу
cv2.approxPolyDP (контур, приблизителна точност, затворен)
Параметри:
- Контур - е индивидуалният контур, който искаме да приближим.
- Точност на сближаване - важен параметър при определяне на точността на сближаване, малките стойности дават точно сближаване, големите стойности дават повече обща информация. Доброто правило за палеца е по-малко от 5% от периметъра на контура.
- Затворено - булева стойност, която посочва дали приблизителният контур може да бъде отворен или затворен.
Нека се опитаме да приближим една проста фигура на къща
внос numpy като np внос cv2
Заредете изображението и запазете копие
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('original image', orig_image) cv2.waitKey (0)
Сива скала и бинаризиране на изображението
сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold (сиво, 127,255, cv2.THRESH_BINARY_INV)
Намерете контури
_, контури, йерархия = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Повтаряйте през всеки контур и изчислявайте техния ограничаващ правоъгълник
за c в контури: 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)
Итерирайте през всеки контур и изчислете приблизителния контур
за c в контури:
# изчисли точност като процент от точността на контура на периметъра = 0,03 * cv2.arcLength (c, True) приблизително = cv2. ApproxPolyDP (c, точност, True) cv2.drawContours (изображение,, 0, (0,255,0), 2) cv2.imshow ('Приблизително polyDP', изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Изпъкнал корпус
Изпъкналият корпус е основно външните ръбове, представени чрез изчертаване на линии над дадена фигура.
Това може да е най-малкият многоъгълник, който може да се побере около самия обект.
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)
Ограничете изображението
ret, thresh = cv2.threshold (сиво, 176,255,0)
Намерете контури
_, контури, йерархия = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Сортирайте контурите по площ и след това премахнете най-големия контур на рамката
n = len (контури) -1 контури = сортирани (контури, ключ = cv2.contourArea, обратен = False)
Повтаряйте се през контурите и нарисувайте изпъкнал корпус
за c в контури:
hull = cv2.convexHull (c) cv2.drawContours (изображение,, 0, (0,255,0), 2) cv2.imshow ('изпъкнал корпус', изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Съвпадащ контур по форми
cv2.matchShapes (контурен шаблон, контурен метод, параметър на метода)
Изход - стойност на съвпадение (по-ниска стойност означава по-тясно съвпадение)
шаблон за контур - Това е нашият референтен контур, който се опитваме да намерим в ново изображение.
контур - Индивидуалният контур, срещу който проверяваме.
Метод - Тип на контурното съвпадение (1,2,3).
параметър на метода - оставете сам като 0.0 (не се използва в python opencv)
import cv2 import numpy като np
Заредете шаблона за форма или референтно изображение
template = cv2.imread ('star.jpg', 0) cv2.imshow ('template', template) cv2.waitKey (0)
Заредете целевото изображение с фигурите, които се опитваме да съпоставим
target = cv2.imread ('shapestomatch.jpg') сиво = cv2.cvtColor (target, cv2.COLOR_BGR2GREY)
Първо ограничете и двете изображения, преди да използвате cv2.findContours
ret, thresh1 = cv2.threshold (шаблон, 127,255,0) ret, thresh2 = cv2.threshold (сив, 127,255,0)
Намерете контури в шаблона
_, контури, йерархия = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # трябва да сортираме контурите по площ, за да можем да премахнем най-големия контур, който е
Контур на изображението
sorted_contours = сортирано (контури, ключ = cv2.contourArea, reverse = True) # извличаме втория по големина контур, който ще бъде нашият шаблон контур tempelate_contour = контури # извличане на контурите от второто целево изображение _, контури, йерархия = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) за c в контури: # надписвайте през всеки контур в целевото изображение и използвайте cv2.matchShape, за да сравните формата на контура съвпадение = cv2.matchShapes (tempelate_contour, c, 1,0.0) print ("match") #if стойност на съвпадението е по-малка от 0,15, ако съвпадението <0,16: близкия_контур = c друго: най- близкото_контур = cv2.drawContours (target,, - 1, (0,255,0), 3) cv2.imshow ('output',цел) cv2.waitKey (0) cv2.destroyAllWindows ()
Конзолен изход -
0,16818605122199104
0,19946910256158912
0,18949760627309664
0,11101058276281539
Има три различни метода с различна математическа функция, можем да експериментираме с всеки метод, като просто заменим стойностите на метода cv2.matchShapes (tempelate_contour, c, 1, 0.0), които варират от 1,2 и 3, за всяка стойност ще получите различно съвпадение стойности в изхода на конзолата.
6. Идентифициране на фигури (кръг, правоъгълник, триъгълник, квадрат, звезда)
OpenCV може да се използва и за автоматично откриване на различни видове фигури от изображението. С помощта на кода по-долу ще можем да открием кръг, правоъгълник, триъгълник, квадрат и звезди от изображението.
import cv2 import numpy като np
Заредете и след това изображения в сиво
image = cv2.imread ('shape.jpg') сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY) cv2.imshow ('идентифициране на фигури', изображение) cv2.waitKey (0) ret, thresh = cv2.threshold (сиво, 127,255,1)
Извличане на контури
_, контури, йерархия = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
За cnt в контури:
Получете приблизителни полигони приблизително = cv2.approxPolyDP (cnt, 0,01 * cv2.arcLength (cnt, True), True), ако len (приблизително) == 3: shape_name = "Triangle" cv2.drawContours (image,, 0, (0,255, 0), - 1)
намерете контурен център, за да поставите текст в центъра
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (приблизително) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M)
Проверете дали този четиристранен многоъгълник е квадрат или правоъгълник
# cv2.boundingRect връща лявата ширина и височина в пиксели, започвайки от горния # лев ъгъл, за квадрат би било приблизително същото, ако abs (wh) <= 3: shape_name = "square" # намери контурен център, за да поставите текст на 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" # намерете контурен център, за да поставите текст в центъра cv2.drawContours (изображение,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (изображение, име_на форма, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (приблизително) == 10: shape_name = "звезда" cv2.drawContours (image,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (приблизително)> = 15: shape_name = 'circle' cv2.drawContours (изображение,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow („идентифициране на фигури“, изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Откриване на линии
Откриването на линии е много важна концепция в OpenCV и има обещаваща употреба в реалния свят. Автономните автомобили използват алгоритми за откриване на линии за откриване на ленти и пътища.
При откриване на линия ще се справим с два алгоритма,
- Алгоритъм на Hough Line
- Пробалистичен алгоритъм на Hough Line.
Може би сте запомнили представянето на права от математиката в гимназията с уравнението y = mx + c.
В OpenCV обаче линията е представена по друг начин
Уравнението по-горе ρ = xcosӨ + ysincosӨ е OpenCV представяне на линията, където ρ е перпендикулярното разстояние на линията от начало и Ө е ъгълът, образуван от нормалата на тази линия към началото (измерено в радиани, при което 1pi радиани / 180 = 1 градус).
Функцията OpenCV за откриване на линия е дадена като
cv2.HoughLines (бинаризирано изображение, ρ точност, Ө точност, праг), където прагът е минималният глас, за да се счита за линия.
Сега нека открием редове за изображение на кутия с помощта на функцията за линия на Hough на opencv.
import cv2 import numpy as np image = cv2.imread ('box.jpg')
Извлечени са сиви скали и остри ръбове
сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY) ръбове = cv2.Canny (сиво, 100 170, apertureSize = 3)
Изпълнете линиите на Hough, използвайки rho точност от 1 пиксел
#theta точността на (np.pi / 180), която е 1 градус # прагът на линията е зададен на 240 (брой точки на линията) линии = cv2.HoughLines (ръбове, 1, np.pi / 180, 240) # итерираме през всеки ред и конвертирате във формат # изисква се от cv2.lines (т.е. изискват се крайни точки) за i в диапазон (0, len (редове)): за rho, theta в редове: 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 (изображение, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('Hough lines', изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
Сега нека повторим откриването на горната линия с друг алгоритъм на вероятностната линия на Hough.
Идеята зад вероятностната линия на Hough е да се вземе произволно подмножество точки, достатъчно за откриване на линия.
Функцията OpenCV за вероятностна линия Hough е представена като cv2.HoughLinesP (бинаризирано изображение, ρ точност, Ө точност, праг, минимална дължина на линията, максимална празнина на линията)
Сега нека открием линиите на кутиите с помощта на вероятностни линии на Hough.
import cv2 import numpy като np
Извадени са скали на сивата скала и слаби ръбове
image = cv2.imread ('box.jpg') сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY) ръбове = cv2.Canny (сиво, 50,150, apertureSize = 3) # отново използваме същата точност на rho и theta #horely, ние посочваме минимален глас (точки по линия) от 100 # и мин. дължина на реда от 5 пиксела и максимална разлика между редовете от 10 пиксела линии = cv2.HoughLinesP (ръбове, 1, np.pi / 180,100,100,10) за i в диапазон (0, len (редове)): за x1, y1, x2, y2 в редове: cv2.line (изображение, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('пробалистични линии на Hough', изображение) cv2.waitKey (0) cv2.destroyAllWindows
8. Откриване на петна
Blobs могат да бъдат описани като група свързани пиксели, които всички споделят общо свойство. Методът за използване на детектор на петна OpenCV е описан чрез тази диаграма.
За изчертаване на ключовите точки използваме cv2.drawKeypoints, който приема следните аргументи.
cv2.drawKeypoints (входно изображение, ключови точки, blank_output_array, цвят, флагове)
където в знамената може да бъде
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
и празно тук е почти нищо друго освен една по една матрица от нули
Сега нека извършим откриването на петна върху изображение на слънчоглед, където петна ще бъдат централните части на цветето, тъй като те са често срещани сред всички цветя.
import cv2 import numpy as np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE)
Настройте детектор с параметри по подразбиране
детектор = cv2.SimpleBlobDetector_create ()
Откриване на петна
ключови точки = detector.detect (изображение)
Начертайте откритите петна като червени кръгове
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS гарантира, че # размера на кръга съответства на размера на blob празно = np.zeros ((1,1)) blobs = cv2.drawKeypoints (изображение, ключови точки, празно, (0,255,255), cv2.DRAW_MAGCHES_LAGS
Показване на ключови точки
cv2.imshow ('blobs', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()
Въпреки че кодът работи добре, но някои от петна са пропуснати поради неравномерни размери на цветята, тъй като цветята отпред са големи в сравнение с цветята в края.
9. Филтриране на петна - броене на кръгове и елипси
Можем да използваме параметри за филтриране на петна според тяхната форма, размер и цвят. За използване на параметри с детектор на петна използваме функцията на OpenCV
cv2.SimpleBlobDetector_Params ()
Ще видим филтриране на петна по главно тези четири параметъра, изброени по-долу:
■ площ
params.filterByArea = True / False params.minArea = пиксели params.maxArea = пиксели
Циркулярност
params.filterByCircularity = True / False params.minCircularity = 1 е перфектен, 0 е противоположен
Изпъкналост - площ на петно / площ на изпъкнал корпус
params.filterByConvexity = Вярно / Невярно params.minConvexity = Площ
Инерция
params.filterByInertia = True / False params.minInertiaRatio = 0,01
Сега нека се опитаме да филтрираме петна по гореспоменатите параметри
import cv2 import numpy as np image = cv2.imread ('blobs.jpg') cv2.imshow ('original image', image) cv2.waitKey (0)
Инициализирайте детектора, като използвате параметрите по подразбиране
детектор = cv2.SimpleBlobDetector_create ()
Откриване на петна
ключови точки = detector.detect (изображение)
Начертайте петна върху нашето изображение като червени кръгове
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 = "общ брой на петна" + str (len (ключови точки)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
Показване на изображение с точки на петна
cv2.imshow ('blob с използване на параметри по подразбиране', blobs) cv2.waitKey (0)
Задайте нашите параметри за филтриране
# инициализиране на настройка на параметри с помощта на cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()
Задайте параметри за филтриране на площ
params.filterByArea = Истински params.minArea = 100
Задайте параметри за филтриране на циркулярност
params.filterByCircularity = Истински params.minCircularity = 0.9
Задайте параметър за филтриране на изпъкналост
params.filterByConvexity = Фалшиви params.minConvexity = 0,2
Задайте параметър за филтриране на инерцията
params.filterByInertia = Истински params.minInertiaRatio = 0,01
Създайте детектор с параметър
детектор = cv2.SimpleBlobDetector_create (параметри)
Откриване на петна
ключови точки = detector.detect (изображение)
Начертайте петна върху изображенията като червени кръгове
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (изображение, ключови точки, празно, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "общ брой кръгли петна" + str (len (ключови точки)) cv2.putText (петна, текст, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Показване на петна
cv2.imshow („филтриране на кръгови петна“, петна) cv2.waitKey (0) cv2.destroyAllWindows ()
Така че по този начин може да се направи сегментиране на изображения в Python-OpenCV. За да получите добро подценяване на компютърното зрение и OpenCV, прегледайте предишни статии (Първи стъпки с Python OpenCV и манипулации на изображения в Python OpenCV и ще можете да направите нещо страхотно с Computer Vision.