python opencv - detecção de blob ou detecção de círculo

Estou tendo problemas para detectar áreas circulares. Eu tentei com a função HoughCircles do opencv. No entanto, embora as imagens sejam bastante semelhantes, os parâmetros para a função precisam ser diferentes para detectar os círculos.

Outra abordagem que tentei foi percorrer todos os pixels e verificar se o pixel atual é branco. Se for esse o caso, verifique se há um objeto de blob na área (distância ao centro do blob menor que um limite). Se houver, acrescente o pixel ao blob; caso contrário, crie um novo blob. Isso também não funcionou corretamente.

Alguém tem uma idéia de como posso fazer isso funcionar (detecção de 90%)? Anexei uma imagem de exemplo e outra imagem onde marquei os círculos. Obrigado!

ATUALIZAR: Obrigado pela ajuda até agora! Este é o código em que adquiro os contornos e os filtrei por área:

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)

Isso funciona muito bem. Eu os desenhei na imagem:

Essa é a parte em que eu filtro por circularidade, ela fica logo abaixo do código em que eu filtro por área:

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)

No entanto, a nova lista 'contours_cirles' está vazia. Imprimi 'circularidade' no loop e os valores estão todos entre 10 000 e 100 000.

ATUALIZAÇÃO # 2: Depois de corrigir os suportes ausentes, ele está funcionando agora!

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)

Muito obrigado pessoal! :)

questionAnswers(2)

yourAnswerToTheQuestion