Читать все символы из капчи в python, используя любую библиотеку - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу прочитать символы капчи как одну строку.

Код капчи, который я хочу проанализировать, находится в определенном порядке.Образцы изображений доступны ниже:

enter image description here

enter image description here

enter image description here

Все приведенные выше фоновые изображения для изображений одинаковы и так далее.Только символы перетасовываются каждый раз с их положением (т.е. символы недоступны в определенном направлении), но кажется, что длина всех символов одинакова.

Я пытался прочитать текст с этих изображений, используя pytesseract библиотека питонов.Кроме того, я попробовал доступные примеры здесь , но ни один из них не работает для меня.

В этой SO ссылке я нашел одно решение, которое является рыночным как правильный / правильный ответно это работает только для числа капчи.

Кроме того, многие люди считают, что сначала нам следует удалить фоновый шум / размытие изображения, а затем обработать изображение, но для меня это совершенно неосознанно.

Я попробовал, как показано ниже:

from PIL import Image, ImageEnhance, ImageFilter
import pytesseract

img = Image.open("test.png")
imagetext = pytesseract.image_to_string(img)
print(imagetext) 

Может кто-нибудь указать мне направление для того же?

1 Ответ

0 голосов
/ 07 января 2019

Поскольку в капче используется ограниченное количество символов (латинские буквы + цифры), а форма символов остается неизменной, вы можете создать библиотеку символов следующим образом:

enter image description hereenter image description hereenter image description hereenter image description here* ** 1 014 *enter image description hereenter image description here* 1022 один тысяча двадцать-один*enter image description hereenter image description hereenter image description hereenter image description hereenter image description here

Вам необходимо присвоить каждому изображению имя с соответствующим именем, например: "F.png" и поместить в папку "lib".Затем запустите следующий скрипт для ваших капч:

import cv2
import glob
import numpy
import ntpath
from PIL import Image

IMAGES = ['S3RZX.png', 'HF482.png', 'YMMR9.png']
symbols = glob.glob('lib/*.png')


def guess_captcha(image):
    image = Image.open(image)
    pixels = image.load()
    size = image.size

    # Cleanup background noises from captcha
    for x in range(size[0]):
        for y in range(size[1]):
            if pixels[x, y][0] < 120:
                pixels[x, y] = (0, 0, 0)
            else:
                pixels[x, y] = (255, 255, 255)

    # Search symbols in captcha
    image = numpy.array(image)
    result = []
    for symbol in symbols:
        img_symbol = cv2.imread(symbol)
        match = cv2.matchTemplate(img_symbol, image, cv2.TM_CCOEFF_NORMED)
        if len(match):
            _, quality, _, location = cv2.minMaxLoc(match)
            if quality > 0.8:
                result.append({'x': location[0], 'symbol': ntpath.basename(symbol).replace('.png', '')})
    result = sorted(result, key=lambda k: k['x'])
    return ''.join([x['symbol'] for x in result])


for img in IMAGES:
    print('{} -> {}'.format(img, guess_captcha(img)))

То, что у меня есть в конце:

S3RZX.png -> S3RZX
HF482.png -> HF482
YMMR9.png -> YR9

Первые две капчи решены правильно.Последняя капча решена некорректно из-за наложения символов «М».Проблему с наложением действительно трудно решить, поэтому лучше пропустить такие капчи.

...