Обнаружение зрачка на изображениях глаз с использованием питона - PullRequest
0 голосов
/ 15 апреля 2019

Мне нужно отметить ученика на изображении, подобном этому, на глазу. Я написал этот код Eye Image

img_name='6.jpg'
image = cv2.imread(img_name)
image_copy_new=cv2.imread(img_name)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
retval, thresholded = cv2.threshold(gray, 30, 255, cv2.THRESH_BINARY_INV)
plt.imshow(thresholded,cmap="gray")

Это производит вывод как это -

Threshold

Затем я искал контуры на изображениях и попытался найти только самый круглый на изображении с помощью этого кода

contours, hierarchy = cv2.findContours(thresholded, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
image_copy = np.zeros_like(image)  # create a new emtpy image
for cnt in contours:
    peri = cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, 0.04 * peri, True)
    (x, y, w, h) = cv2.boundingRect(cnt)
    ar = w / float(h)
    if w*h > 20 and 0.9 < ar < 1.1:  # filtering condition
        cv2.drawContours(image, [cnt], 0, 255, -1)

Хотя это дает отличные результаты в некоторых случаях, когда глаза направлены вперед, но в других случаях (например, в этом) оно полностью терпит неудачу. Я пробовал много других вещей, таких как «грубое преобразование, разные морфы» , но я не могу решить эту проблему. Изображения имеют только глаза и не все лицо, иначе обнаружение лица смазывается Случаи, когда этот код работает Working case

Спасибо, что нашли время и помогли мне.

1 Ответ

0 голосов
/ 15 апреля 2019

Может помочь добавление размытия, эрозии и расширения.Эрозия удалит очень мелкие объекты, такие как шум вокруг ресниц, а расширение приведет к тому, что уцелевшие точки вернутся к размеру.Изменяя размеры эрозии и расширения, вы сможете избавиться от большей части шума и сделать так, чтобы зрачок в центре выглядел намного лучше.

Вот пример того, как я бы это сделал:

    gray = cv2.cvtColor(frame_in, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    thresh = cv2.threshold(blurred, 30, 255, cv2.THRESH_BINARY)[1]
    erosion_size = 10
    dilate_size = 8
    thresh = cv2.erode(thresh, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (erosion_size, erosion_size)))
    thresh = cv2.dilate(thresh, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (dilate_size, dilate_size)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...