Как можно использовать функцию обрезки, чтобы сделать это изображение читабельным для pytesseract?
Так вот следующее изображение https://imgur.com/a/E6mpB
Я хочу выделить каждый из этих номеров, чтобы я мог прочитать их pytesseract
,
Вот сценарий, который я написал до сих пор:
try:
import Image
except ImportError:
from PIL import Image
import pytesseract as tes
filename = "test.png";
x1 = (50,60,220,110)
x2 = (45,160,230,228)
x3 = (45,260,330,328)
image = Image.open( filename );
cropped_image = 'cropped_image'
scores = [x1, x2, x3]
for i in scores:
cropped_image1 = image.crop ( i )
results = tes.image_to_string(cropped_image1,lang="letsgodigital",boxes=False)
print(results)
так что в основном я обрезаю это изображение для каждого числа. Однако я не чувствую, что это решение очень эффективно (плюс не так просто найти координату для каждого числа. Я планирую применить этот скрипт к нескольким изображениям, но число всегда будет в одном месте. Любая идея о том, как я могу сделать этот скрипт лучше?
Надеюсь, проблема ясна.
Благодарю.
PS: я не знаю почему, но загрузка изображения прямо в мой пост не работает....
1 ответ
Если номера каждого изображения находятся в позициях образца, использование многопроцессорной обработки для обработки обрезанных изображений ускорит время выполнения как multiprocessing
может выполнять параллелизм данных для передачи одного изображения (данных) на ядро процессора. Если на вашей машине установлен один ЦП с 4 ядрами, время обработки вашего образца будет сокращено до более 3 единиц вместо 12 единиц для 12 обрезанных изображений. Вы можете использовать Google для получения дополнительной информации и примеров.
Чтобы улучшить pytesseract
Точность распознавания текста, вы можете сделать пороговое изображение черно-белым. Ниже приведен пример обрезанных изображений.
Пример кода на черно-белом.
threshold = 60
cropped = image.crop(x)
cropped = cropped.convert('L')
inverted = PIL.ImageOps.invert(cropped)
inverted_mask = inverted.point(lambda p: p < threshold and 255)