Также, чтобы обнаружить круги на изображении и поиграть с порогами, чтобы получить желаемый результат (обнаруженные круги в зеленых границах с красными точками в качестве центров):
я проблемы с определением круговых областей. Я попробовал это с функцией HoughCircles от opencv. Однако даже если изображения довольно похожи, параметры функции должны быть разными, чтобы обнаружить круги.
Другой подход, который я попробовал, состоял в том, чтобы перебрать каждый пиксель и проверить, является ли текущий пиксель белым. Если это так, то проверьте, есть ли в области объект блоба (расстояние до центра капли меньше порога). Если есть, добавьте пиксель к BLOB-объекту, если нет, то создайте новый BLOB-объект. Это также не сработало должным образом.
Кто-нибудь знает, как я могу сделать эту работу (90% обнаружения)? Я приложил пример изображения и другое изображение, где я отметил круги. Спасибо!
ОБНОВИТЬ: Спасибо за помощь до сих пор! Это код, где я получаю контуры и фильтрую их по площади:
im = cv2.imread('extract_blue.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gauss = cv2.GaussianBlur(imgray, (5, 5), 0)
ret, thresh = cv2.threshold(im_gauss, 127, 255, 0)
# get contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours_area = []
# calculate area and filter into new array
for con in contours:
area = cv2.contourArea(con)
if 1000 < area < 10000:
contours_area.append(con)
Это работает довольно аккуратно. Я нарисовал их на картинке:
Это та часть, где я фильтровал по кругу, он идет прямо под кодом, где я фильтрую по области:
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/perimeter*perimeter)
print circularity
if 0.8 < circularity < 1.2:
contours_cirles.append(con)
Однако новый список 'contours_cirles' пуст. Я напечатал 'цикличность' в цикле, и все значения находятся между 10 000 и 100 000.
ОБНОВЛЕНИЕ № 2: После исправления пропущенных скобок он работает сейчас!
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/(perimeter*perimeter))
print circularity
if 0.7 < circularity < 1.2:
contours_cirles.append(con)
Большое спасибо, ребята! :)