Как правильно извлечь буквы после очистки фона изображения с помощью opencv и python? - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь извлечь буквы отдельно из изображения opencv, но у меня возникают трудности в некоторых случаях.Иногда случается, что он берет одну и ту же букву и делит ее посередине.В некоторых случаях, таких как буква «i», он не может поднять точку и считает ее другим символом.Ниже у меня есть 3 примера входного изображения, после применения функции эрозии и после поиска контура для извлечения букв.

Пример изображения

И мой фрагмент кода:

import cv2
import numpy as np
import imutils

img = cv2.imread('captchas/image.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU|cv2.THRESH_BINARY_INV)[1]

kernel = np.ones((5,4), np.uint8)

img_erode = cv2.erode(thresh, kernel, iterations = 1)

contours = cv2.findContours(img_erode.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

contours = contours[0] if imutils.is_cv2() else contours[1]

letter_image_regions = []

output = img_erode.copy()

for contour in contours:

    (x, y, w, h) = cv2.boundingRect(contour)

    if cv2.contourArea(contour) > 200:
        if w / h > 0.75:

            half_width = int(w / 2)
            cv2.rectangle(output, (x, y), (x + half_width, y + h), (70,0,70), 3)
            cv2.rectangle(output, (x, y), (x + w, y + h), (70,0,70), 3)
        else:

            cv2.rectangle(output, (x, y), (x + w, y + h), (70,0,70), 3)

cv2.imshow("Input", img)
cv2.imshow("Erode", img_erode)
cv2.imshow("Output", image)
cv2.waitKey(0)

1 Ответ

0 голосов
/ 21 ноября 2018

Письмо-причина Z делится пополам, это условие if w / h > 0.75:, и вы рисуете cv2.rectangle(output, (x, y), (x + half_width, y + h), (70,0,70), 3).Поэтому постарайтесь найти лучшее условие.

Чтобы получить всю букву i, выполните morphologyEx() после erode() и до findContour().

kernel2 = np.ones((22,7), np.uint8)

morph_img = img_erode.copy()
cv2.morphologyEx(src=img_erode, op=cv2.MORPH_CLOSE, kernel=kernel2, dst=morph_img)

И результат я получаю.Вы можете настроить размер kernel2 для лучшего результата.

enter image description here

...