Найти несколько кругов с разными размерами в изображении - PullRequest
0 голосов
/ 20 апреля 2020

Мне нужно найти круги на изображении разных размеров. Я не могу показать само изображение, но я попытался создать «фиктивное изображение»:

Как вы можете видеть: есть несколько кругов , с разными размерами. Некоторые прозрачны посередине, некоторые нет. Белые круги важны здесь. Реальный фон не такой ровный, как здесь, поскольку это изображение, но это может имитировать его хорошо.

Теперь мой код должен уметь делать две вещи:

  1. Найти местоположения центров окружностей.
  2. Уметь показать, насколько точно это действительно местоположения центров окружностей.

Для первого пункта: я пытался использовать OpenCV templateMatch, который очень хорошо работает только для одного размера, а не для разных размеров. Я также попытался использовать несколько шаблонов с разными размерами, где код превысил бы oop, но это занимает много времени, так как должно быть много шаблонов с разными размерами. Затем я попытался использовать OpenCV Hough Circles, но этот круг, кажется, не находит каждый круг:

Затем я попытался использовать OpenCV findContours, но поскольку фон не даже как на изображении, слишком много контуров там, где было показано.

Теперь я понятия не имею, какие у меня есть другие варианты.

Есть ли хороший / хороший способ найти эти круги, включая показатель достоверности за найденный круг? Итак, насколько уверена программа в том, что эти найденные точки верны? Является ли OpenCV модулем для использования? Или я должен использовать что-то другое (техника / модуль / метод)?

1 Ответ

0 голосов
/ 20 апреля 2020

Вот один из способов сделать это в Python / OpenCV.

  • Считать ввод
  • Преобразовать в серый
  • Размытие (для сглаживания фона)
  • Порог
  • Применить морфологию закрыть и открыть для сглаживания
  • Получить контуры
  • Нарисовать контуры и центроиды
  • Сохранить результаты

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('circles.png')

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# apply gaussian blur
blur = cv2.GaussianBlur(gray, (9,9), 0)


# threshold
thresh = cv2.threshold(blur,128,255,cv2.THRESH_BINARY)[1]


# apply close and open morphology to smooth
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9,9))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

# draw contours and get centroids
circles = img.copy()
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
for cntr in contours:
    cv2.drawContours(circles, [cntr], -1, (0,0,255), 2)
    M = cv2.moments(cntr)
    cx = int(M["m10"] / M["m00"])
    cy = int(M["m01"] / M["m00"])
    x = round(cx)
    y = round(cy)
    circles[y-2:y+3,x-2:x+3] = (0,255,0)
    print(cx,",",cy)        


cv2.imshow("thresh", thresh)
cv2.imshow("circles", circles)

cv2.waitKey(0)
cv2.destroyAllWindows()

# save cropped image
cv2.imwrite('circles_thresh.png',thresh)
cv2.imwrite('circles_centroids.png',circles)


Пороговое изображение:

enter image description here

Результирующее изображение с круговыми контурами и центроидами:

enter image description here

Центроиды:

1395 , 937
492 , 891
1617 , 647
978 , 573
1286 , 295
304 , 227
737 , 140


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...