- 1. Сегментація та контури
- 2. Ієрархія та режим пошуку
- 3. Апроксимація контурів та пошук їх опуклої оболонки
- 4. Опуклий корпус
- 5. Відповідність контуру за фігурами
- 6. Визначення фігур (коло, прямокутник, трикутник, квадрат, зірка)
- 7. Виявлення лінії
- 8. Виявлення краплин
- 9. Фільтрування крапель - підрахунок кіл і еліпсів
У попередніх підручниках ми використовували OpenCV для базової обробки зображень та виконували деякі попередні операції редагування зображень. Як ми знаємо, OpenCV - це відкрита бібліотека Commuter Vision, яка має інтерфейси C ++, Python та Java та підтримує Windows, Linux, Mac OS, iOS та Android. Тож його можна легко встановити в Raspberry Pi за допомогою середовища Python та Linux. А Raspberry Pi з OpenCV та підключеною камерою можна використовувати для створення багатьох програм обробки зображень у режимі реального часу, таких як виявлення обличчя, блокування обличчя, відстеження об’єктів, виявлення номерних знаків автомобіля, система домашньої безпеки тощо. У цьому посібнику ми дізнаємось, як це робити сегментація зображень за допомогою OpenCV. Операції, які ми збираємось виконати, перелічені нижче:
- Сегментація та контури
- Ієрархія та режим пошуку
- Наближення контурів і знаходження їх опуклої оболонки
- Конекс Халл
- Відповідний контур
- Визначення фігур (коло, прямокутник, трикутник, квадрат, зірка)
- Виявлення лінії
- Виявлення крапель
- Фільтрування крапель - підрахунок кіл і еліпсів
1. Сегментація та контури
Сегментація зображень - це процес, за допомогою якого ми розділяємо зображення на різні регіони. Тоді як контури - це суцільні лінії або криві, які обмежують або охоплюють повну межу об’єкта на зображенні. І тут ми будемо використовувати техніку сегментації зображення, яка називається контурами, для вилучення частин зображення.
Крім того, контури дуже важливі в
- Виявлення об’єктів
- Аналіз фігури
І вони мають дуже широку сферу застосування від реального аналізу зображень до аналізу медичних зображень, таких як МРТ
Давайте знати, як реалізувати контури в opencv, виділяючи контури квадратів.
імпорт cv2 імпорт numpy як np
Давайте завантажимо просте зображення з 3 чорними квадратами
image = cv2.imread ('squares.jpg') cv2.imshow ('вхідне зображення', зображення) cv2.waitKey (0)
Відтінки сірого
сірий = cv2.cvtColor (зображення, cv2.COLOR_BGR2GREY)
Знайти кумедні краї
edged = cv2.Canny (сірий, 30200) cv2.imshow ('кутні краї', обрізаний) cv2.waitKey (0)
Пошук контурів
#використовуйте копію вашого зображення, наприклад - edged.copy (), оскільки пошук контурів змінює зображення # ми повинні додати _, перед контурами як порожній аргумент через оновлення версії OpenCV _, contours, hierarchy = cv2.findContours (Edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('обтяжені краї після контурування , обрізні) cv2.waitKey (0)
Друк файлу контуру, щоб знати, з яких контурів складається
print (контури) print ('Кількість знайдених контурів =' + str (len (контури)))
Намалюйте всі контури
# використовувати -1 як 3-й параметр, щоб намалювати всі контури cv2.drawContours (зображення, контури, -1, (0,255,0), 3) cv2.imshow ('контури', зображення) cv2.waitKey (0) cv2. знищитиAllWindows ()
Вихід консолі -],],], …,],],]], 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 - отримує все у дворівневій ієрархії.
cv2.RETR_TREE - отримує все в повній ієрархії.
Ієрархія зберігається у наступному форматі
Тепер проілюструємо різницю між першими двома режимами пошуку, cv2.RETR_LIST та cv2.RETR_EXTERNAL.
імпорт cv2 імпорт numpy як np
Давайте завантажимо просте зображення з 3 чорними квадратами
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
Відтінки сірого
сірий = cv2.cvtColor (зображення, cv2.COLOR_BGR2GREY)
Знайди Canny Edges
edged = cv2.Canny (сірий, 30200) cv2.imshow ('кутні краї', обрізаний) 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 (контури)))
Намалюйте всі контури
# використовувати -1 як 3-й параметр, щоб намалювати всі контури cv2.drawContours (зображення, контури, -1, (0,255,0), 3) cv2.imshow ('контури', зображення) cv2.waitKey (0) cv2. знищити всі Windows
імпорт cv2 імпорт numpy як np
Давайте завантажимо просте зображення з 3 чорними квадратами
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
Відтінки сірого
сірий = cv2.cvtColor (зображення, cv2.COLOR_BGR2GREY)
Знайти кумедні краї
edged = cv2.Canny (сірий, 30200) cv2.imshow ('кутні краї', обрізаний) 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 (контури)))
Намалюйте всі контури
# використовувати -1 як 3-й параметр, щоб намалювати всі контури cv2.drawContours (зображення, контури, -1, (0,255,0), 3) cv2.imshow ('контури', зображення) cv2.waitKey (0) cv2. знищитиAllWindows ()
Отже, через демонстрацію вищезазначених кодів ми могли чітко побачити різницю між cv2.RETR_LIST та cv2.RETR_EXTERNNAL , у cv2.RETR_EXTERNNAL враховуються лише зовнішні контури, тоді як внутрішні контури ігноруються.
У той час як у cv2.RETR_LIST також враховуються внутрішні контури.
3. Апроксимація контурів та пошук їх опуклої оболонки
При апроксимації контурів контурна форма наближається до іншої контурної форми, яка може бути не так сильно схожа на першу контурну форму.
Для наближення ми використовуємо функцію pribliPolyDP для openCV, що пояснюється нижче
cv2.approxPolyDP (контур, точність наближення, закритий)
Параметри:
- Контур - це окремий контур, який ми хочемо наблизити.
- Точність наближення - важливий параметр при визначенні точності наближення, малі значення дають точне наближення, великі значення дають більше загальної інформації. Хороше правило великого пальця - менше 5% периметра контуру.
- Closed - булеве значення, яке визначає, чи може приблизний контур бути відкритим чи закритим.
Спробуємо наблизити просту фігуру будинку
імпортувати 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_BGR2GREY) 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 ('Обмежувач прямої', 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_BGR2GREY) cv2.imshow ('original image', image) cv2.waitKey (0)
Порогове значення зображення
ret, thresh = cv2.threshold (сірий, 176255,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)
імпорт cv2 імпорт numpy як np
Завантажте шаблон фігури або контрольне зображення
template = cv2.imread ('star.jpg', 0) cv2.imshow ('шаблон', шаблон) cv2.waitKey (0)
Завантажте цільове зображення фігурами, які ми намагаємось зрівняти
target = cv2.imread ('shapestomatch.jpg') grey = cv2.cvtColor (target, cv2.COLOR_BGR2GREY)
Спочатку встановіть обмеження для обох зображень, перш ніж використовувати cv2.findContours
ret, thresh1 = cv2.threshold (шаблон, 127,255,0) ret, thresh2 = cv2.threshold (сірий, 127,255,0)
Знайдіть контури в шаблоні
_, contours, hierarhy = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # нам потрібно сортувати контури за площею, щоб ми могли видалити найбільший контур, який є
Контур зображення
sorted_contours = відсортовано (контури, ключ = cv2.contourArea, reverse = True) # ми витягуємо другий за величиною контур, який буде нашим шаблоном контур tempelate_contour = contours # витягуємо контури з другого цільового зображення _, contours, hierarchy = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) для c у контурах: # перебирайте кожен контур у цільовому зображенні та використовуйте cv2.matchShape для порівняння форми контуру збігу = cv2.matchShapes (tempelate_contour, c, 1,0.0) print ("match") # якщо значення збігу менше 0,15, якщо збіг <0,16: ближчий_контур = c ще: найближчий_контур = cv2.drawContours (цільовий,, - 1, (0,255,0), 3) cv2.imshow ('вихід'), ціль) 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 також може використовуватися для автоматичного виявлення різних типів фігур на зображенні. Використовуючи код нижче, ми зможемо виявити на зображенні коло, прямокутник, трикутник, квадрат та зірки.
імпорт cv2 імпорт numpy як np
Завантажте, а потім зображення в масштабі сірого
image = cv2.imread ('shape.jpg') сірий = cv2.cvtColor (зображення, cv2.COLOR_BGR2GREY) cv2.imshow ('ідентифікація фігур', зображення) cv2.waitKey (0) ret, thresh = cv2.threshold (сірий, 127255,1)
Витягніть контури
_, контури, ієрархія = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Для cnt в контурах:
Отримайте приблизні полігони approx = 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 / М)
Перевірте, чи чотиригранний багатокутник квадратним чи прямокутним
# 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) ще: 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 = 'коло' 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 і має перспективне використання в реальному світі. Автономні машини використовують алгоритми виявлення ліній для виявлення смуг руху та доріг.
Під час виявлення рядків ми матимемо справу з двома алгоритмами
- Алгоритм лінії Хафа
- Алгоритм пробалістичної лінії Хафа.
Можливо, ви пам’ятали подання лінії з математики середньої школи з рівнянням y = mx + c.
Однак у OpenCV лінія представлена іншим способом
Рівняння вище ρ = xcosӨ + ysincosӨ - це OpenCV подання прямої, де ρ - перпендикулярна відстань лінії від початку координат, а Ө - кут, утворений нормаллю цієї прямої до початку координат (вимірюється в радіанах, де 1пі радіан / 180 = 1 градус).
Функція OpenCV для виявлення лінії подається як
cv2.HoughLines (бінарізоване зображення, ρ точність, Ө точність, поріг), де поріг - це мінімальний голос, щоб його вважали лінією.
Тепер давайте виявимо рядки для зображення вікна за допомогою функції рядка Хафа у opencv.
import cv2 import numpy as np image = cv2.imread ('box.jpg')
Витягнуті відтінки сірого та м'які краї
сірий = cv2.cvtColor (зображення, cv2.COLOR_BGR2GREY) краї = cv2.Canny (сірий, 100,170, apertureSize = 3)
Виконуйте лінії Hough з точністю до 1 пікселя
#theta точність (np.pi / 180), яка дорівнює 1 градусу # поріг лінії встановлений на 240 (кількість точок на лінії) рядки = cv2.HoughLines (краї, 1, np.pi / 180, 240) # ми повторюємо через кожен рядок і перетворити у формат # вимагається cv2.lines (тобто вимагає кінцевих точок) для i в діапазоні (0, len (рядки)): для rho, тета в рядках: a = np.cos (theta) b = np.sin (тета) 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', зображення) cv2.waitKey (0) cv2.destroyAllWindows ()
Тепер повторимо вищевикладене виявлення рядків з іншим алгоритмом імовірнісної лінії Хафа.
Ідея імовірнісної лінії Хафа полягає в тому, щоб взяти випадкову підмножину точок, достатню для виявлення лінії.
Функція OpenCV для імовірнісної лінії Hough представлена у вигляді cv2.HoughLinesP (бінарізоване зображення, ρ точність, Ө точність, поріг, мінімальна довжина рядка, максимальний зазор рядка)
Тепер давайте виявимо лінії вікна за допомогою імовірнісних рядків Хафа.
імпорт cv2 імпорт numpy як np
Видалені відтінки сірого та кутові краї
image = cv2.imread ('box.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GREY) edge = cv2.Canny (grey, 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 ('пробалістичні лінії Х'ю', зображення) 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_GREYSCALE)
Налаштуйте детектор із параметрами за замовчуванням
detector = 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_LAG
Показати ключові точки
cv2.imshow ('краплі', краплі) 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 = True / False 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)
Ініціалізуйте детектор, використовуючи параметри за замовчуванням
detector = 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 (краплі, текст, (20550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0255), 2)
Відобразити зображення з крапками крапок
cv2.imshow ('крапля з використанням параметрів за замовчуванням', краплі) cv2.waitKey (0)
Встановіть наші параметри фільтрації
# ініціалізувати налаштування параметрів за допомогою cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()
Встановіть параметри фільтрації області
params.filterByArea = Справжні параметри.minArea = 100
Встановіть параметри фільтрації круговості
params.filterByCircularity = Справжні параметри.minCircularity = 0,9
Встановити параметр фільтрації опуклості
params.filterByConvexity = Помилкові params.minConvexity = 0,2
Встановити параметр фільтрації інерції
params.filterByInertia = Справжні параметри.minInertiaRatio = 0,01
Створити детектор з параметром
detector = cv2.SimpleBlobDetector_create (параметри)
Виявити краплі
ключові точки = detector.detect (зображення)
Намалюйте крапки на зображеннях у вигляді червоних кіл
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 = "загальна кількість круглих крапок" + str (len (ключові точки)) cv2.putText (краплі, текст, (20550), 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.