Как автоматически обнаружить круги в питоне - PullRequest
0 голосов
/ 10 декабря 2018

Я пытался подсчитать монеты на изображениях с разным фоном (не обязательно сплошным).это код, который я нашел здесь в ответе, но проблема в том, что я не хочу менять параметры каждого изображения.Есть ли способ сделать это?

def CountCoins_V2(img):
    image_ori = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    lower_bound = np.array([0,0,10])
    upper_bound = np.array([255,255,195])
    image = img
    mask = cv2.inRange(img, lower_bound, upper_bound)
    #mask = cv2.adaptiveThreshold(image_ori,255,cv2.ADAPTIVE_THRESH_MEAN_C,\cv2.THRESH_BINARY_INV,33,2)
    kernel = np.ones((3, 3), np.uint8)
    mask = cv2.erode(mask, kernel, iterations=6)
    mask = cv2.dilate(mask, kernel, iterations=3)
    closing = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
    contours.sort(key=lambda x:cv2.boundingRect(x)[0])
    array = []
    ii = 1
    for c in contours:
        (x,y),r = cv2.minEnclosingCircle(c)
        center = (int(x),int(y))
        r = int(r)
        if r >= 6 and r<=10:
            cv2.circle(image,center,r,(0,255,0),2)
            array.append(center)
    show_images([image_ori,mask])
    return len(contours)

1 Ответ

0 голосов
/ 10 декабря 2018

В коде есть 2 параметра:

  • Первый - lower_bound = np.array([0,0,10]) и upper_bound = np.array([255,255,195]), которые пороговые для изображения, чтобы получить только цвета в диапазоне от lower_bound до upper_bound,Но в этом коде диапазон слишком широк от [0,0,10] до [255,255,195], поэтому нет смысла.Вы должны ограничить этот диапазон ближе к цвету кругов, которые вы хотите обнаружить.Вы можете узнать больше о цветовых пространствах и пороговых выборках здесь .
  • Вторым является r в (x,y),r = cv2.minEnclosingCircle(c), который является радиусом круга, найденного на изображении.Это важный параметр, и вам нужно провести эксперименты, чтобы найти наилучший диапазон для всех изображений.Я советую использовать соотношение между радиусом и шириной или высотой изображения, чтобы оно не зависело от разрешения изображения.
...