Как извлечь числа из сложной капчи - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь разрешить капчу для следующего изображения

! https://ibb.co/35X723J

Я пробовал использовать tessaract

data = br.open(captchaurl).read()
b = bytearray(data)
save = open(filename, 'wb')
save.write(data)
save.close()
ctext= pytesseract.image_to_string(Image.open(filename))

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Вариант 1:

Я думаю, что использование Pytesseract должно решить эту проблему. Я опробовал ваш код, и он дал мне следующий результат, когда я дал точное обрезанное изображение капчи как ввод в pytesseract:

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

This is the cropped picture from the URL that you specified

Вывод:

print(ctext)
 '436359 oS'

Я предлагаю не указывать полный URL-адрес страницы в качестве ввода в pytesseract. Вместо этого укажите точный URL-адрес изображения как "https://i.ibb.co/RGn9fF5/Jpeg-Image-CS2.jpg", который будет принимать только изображение.

А что касается дополнительных символов 'oS' в выводе, вы можете выполнить строковую манипуляцию, чтобы отрубитьсимволы, отличные от цифр в выводе.

re.sub("[^0-9]", "", ctext)

Вариант 2:

Вы также можете использовать OCR Google для достижения этой цели, которая дает точный результат без ошибок. Хотя я показал вам его веб-интерфейс, в Google есть отличные библиотеки Python, с помощью которых вы можете сделать это с помощью самого Python. Выглядит так:

enter image description here

0 голосов
/ 25 октября 2019

Вот обходной путь. Вам нужно немного очистить изображение, но вы не получите идеальный результат. Попробуйте следующее:

try:
    from PIL import Image
except ImportError:
    import Image
import pytesseract
import cv2

file = 'sample.jpg'

img = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, None, fx=10, fy=10, interpolation=cv2.INTER_LINEAR)
img = cv2.medianBlur(img, 9)
th, img = cv2.threshold(img, 185, 255, cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4,8))
img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imwrite("sample2.jpg", img)


file = 'sample2.jpg'
text = pytesseract.image_to_string(file)
print(''.join(x for x in text if x.isdigit()))
...