Также, чтобы обнаружить круги на изображении и поиграть с порогами, чтобы получить желаемый результат (обнаруженные круги в зеленых границах с красными точками в качестве центров):

я проблемы с определением круговых областей. Я попробовал это с функцией 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)

Большое спасибо, ребята! :)

Ответы на вопрос(2)

Ваш ответ на вопрос