@flexpc

Распознавание капчи на python, как улучшить результат?

captha = images[i]

    scale_percent = int(300)

    image = cv2.imread(captha) #Открываю капчу

    width = int(image.shape[1] * scale_percent / 100)
    height = int(image.shape[0] * scale_percent / 100)

    dim = (width, height)

    resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
    gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)        #
    ret, threshold_image = cv2.threshold(gray, 160, 150, 1, cv2.THRESH_BINARY)

    cv2.imshow('', threshold_image)
    cv2.waitKey(0)

    capthaStr = pytesseract.image_to_string(threshold_image, config='--psm 11') #Преобразовываю в текст


имею вот такой код, капча вот такая
spoiler
6643b0e712dda782419893.jpeg

Она вроде бы не сложная, но я получаю вот такой вывод с кода
Правильный ответ: 3FWS
Ответ программы: 3A NWS



Правильный ответ: 6BYC
Ответ программы: 6 YC



Правильный ответ: A8ES
Ответ программы: SES



Правильный ответ: DY69
Ответ программы: DY 69



Правильный ответ: GD8F
Ответ программы: GOS



Правильный ответ: LBYR
Ответ программы: LB YR



Правильный ответ: X87D
Ответ программы: X8 /D



Правильный ответ: Y9X3
Ответ программы: Y 9X3



Правильно 0 из 8

а вот так ее преобразует cv2
spoiler
6643b13baa26b955304751.png


UDP: вот небольшой пак с этими капчами, если понадобиться
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Не бойтесь экспериментировать. Вот на скорую руку:
scale_percent = 30
image = cv2.imread(captcha)

dim = (image.shape[1] * scale_percent // 100, image.shape[0] * scale_percent // 100)

resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)        #
ret, threshold_image = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
threshold_image = np.invert(threshold_image)

664473ac92045706635146.png
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну так ты хреначишь BGR2GRAY+пороговое преобразование с фиксированным порогом, и думаешь что оно само сработает? Волшебную кнопку ждёшь?
Попробуй перегнать в HSV и поэкспериментируй с каналами, посмотри, какой наиболее информативный. Используй алгоритм Otsu для определения порога.
Попробуй разбить текст на символы, например, через connected components with stats. Если символы не касаются друг друга, должно сработать. Если касаются, то будет сложнее - нужно будет как-то разделять их ДО порогового преобразования.
Потом уже пробуй распознать каждый символ. Если шрифт всегда один и тот же, то может и pytesseract не понадобится, просто собери образцы символов и ищи их через generalized Hough-Guil.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы