python opencv - detección de blob o detección de círculo

Tengo problemas para detectar áreas circulares. Lo probé con la función HoughCircles de opencv. Sin embargo, aunque las imágenes son bastante similares, los parámetros para la función tienen que ser diferentes para detectar los círculos.

Otro enfoque que probé fue iterar sobre cada píxel y verificar si el píxel actual es blanco. Si este es el caso, verifique si hay un objeto blob en el área (la distancia al centro blob es menor que un umbral). Si es así, agregue el píxel al blob, si no, cree un nuevo blob. Esto tampoco funcionó correctamente.

¿Alguien tiene idea de cómo puedo hacer que esto funcione (90% de detección)? Adjunté una imagen de ejemplo y otra imagen donde marqué los círculos. ¡Gracias!

ACTUALIZAR: ¡Gracias por la ayuda hasta ahora! Este es el código donde adquiero los contornos y los filtro 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)

Esto funciona bastante bien. Los dibujé en la imagen:

Esta es la parte donde filtré por circularidad, va directamente debajo del código donde 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)

Sin embargo, la nueva lista 'contours_cirles' está vacía. Imprimí 'circularidad' en el bucle y los valores están entre 10 000 y 100 000.

ACTUALIZACIÓN # 2:&nbsp;¡Después de corregir los corchetes faltantes, está funcionando ahora!

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)

¡Muchas gracias chicos! :)