Поиск окружностей на изображении

Необходимо реализовать поиск пузырьков от маленьких условно 1 пиксель до условно 50 пикселей. Встала необходимость реализовать реализовать поиск диаметров пузырей(окружностей).диаметр в пикселях подойдет. Для этих целей использую openCV и Python.

Есть одно большое изображение - фотография из микроскопа. Я ее разрезал средствами OpenCV по кускам и решил их так анализировать.

Часть большого изображения


    orig  = cv2.imread('image\img.png', cv2.IMREAD_GRAYSCALE)

    # img = orig[0:int(blockH*3), int(blockW):int(blockH*4)]

    clone = orig.copy()


    # Осветляю
    clone = cv2.convertScaleAbs(clone, alpha=1.2, beta=100) 
    structuring_element = np.ones((2, 2), np.uint8)
    clone = cv2.dilate(clone, structuring_element, iterations=1)

    # Sharpen the image 
    # Create the sharpening kernel 
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) 
    clone = cv2.filter2D(clone, -1, kernel) 

    gray = cv2.medianBlur(clone, 3)
    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 12,
                                param1=60, param2=10,
                                minRadius=1, maxRadius=30)


    if circles is not None:
        circles = np.uint16(np.around(circles))
        for i in circles[0, :]:
            center = (i[0], i[1])
            # circle outline
            radius = i[2]
            cv2.circle(orig, center, radius, (255, 0, 255), 1)

    cv2.imshow("orig", orig)
    cv2.waitKey()

И получается вот это:

введите сюда описание изображения

Что я делаю не так, может подскажите?

Мне кажется что проблем в

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 12,
                                param1=60, param2=10,
                                minRadius=1, maxRadius=30)

Изображение перед HoughCircles

введите сюда описание изображения


Ответы (1 шт):

Автор решения: CrazyElf

Так а что вы хотите на выходе? Чтобы окружности не пересекались? Для этого достаточно поиграться параметрами minDist, minRadius, maxRadius. Вот вам меньшее количество не пересекающихся окружностей:

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 60,
                            param1=60, param2=10,
                            minRadius=10, maxRadius=30)

введите сюда описание изображения

Я понимаю, что это наверное не то, что вы хотели, но сформулируйте точно задачу и скажите, что бы вы хотели получить. Ну и нужно экспериментировать с разными параметрами.

→ Ссылка