Как точно получить контур фигуры на изображении? - PullRequest
0 голосов
/ 23 июня 2019

У меня черно-белое 93x94 пиксельное изображение с геометрическими фигурами на них.Я пытаюсь найти контуры фигур, а также их центр

Это то, что я пробовал до сих пор

import cv2
import imutils

img = cv2.imread("input.jpg", cv2.IMREAD_GRAYSCALE)
blurred = cv2.GaussianBlur(img, (5, 5), 0)
thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
for c in cnts:
    # compute the center of the contour
    M = cv2.moments(c)
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])

    # draw the contour and center of the shape on the image
    cv2.drawContours(img, [c], -1, (0, 255, 0), 2)
    cv2.circle(img, (cX, cY), 7, (0, 0, 0), -1)
    #cv2.putText(img, "center", (cX - 20, cY - 20),
        #cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2)

    # show the image
    cv2.imshow('output image',img)
    cv2.waitKey(0)

Вот пример входного и выходного изображения с заданным контуром и образцом

Исходное изображение:

original image

Выходное изображение:

Output image

Как видите, вместо полученияконтур и центр фигуры, я получаю те из ограничительной рамки.

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 23 июня 2019

После размытия и определения порога изображение практически полностью белое.

After threasholding

Я не уверен, чего ожидать от этого.Использование значения 160 делает работу лучше здесь

thresh = cv2.threshold(blurred, 160, 255, cv2.THRESH_BINARY)[1]

Следующая проблема заключается в использовании RETR_EXTERNAL, поскольку

извлекает только крайние внешние контуры.

Использование RETR_TREE кажется правильным

извлекает все контуры и восстанавливает полную иерархию вложенных контуров.

...