PyTesseract - текст разбит горизонтальными белыми линиями - PullRequest
2 голосов
/ 28 марта 2020

Это классическая c проблема PyTesseract для сканирования зашумленных изображений. Однако в этом случае матричный принтер печатает несколько горизонтальных белых линий в тексте. Прилагаются некоторые образцы. Я не уверен, какая предварительная обработка улучшит сканирование текста.
Sample image
Используя приведенную ниже команду, вы получите следующий пример:

tesseract test.png stdout  --psm 6 --dpi 120

Вывод: (ожидаемое значение «RV C 64.80%»)

PRVG
64.5056"

Sample 2
Для приведенного выше изображения pytesseract дает

152.00 KILOGRAW
817.51 USO

и ожидаемое - 152,00 КИЛОГРАММА 617,51 USD

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

1 Ответ

1 голос
/ 01 апреля 2020

Первая картинка, код ручки:

from PIL import Image
import numpy as np
import pytesseract
import time
from collections import Counter

img = Image.open('OCR.png').convert('L')
pixelArray = img.load()
threshold = 240
table = []
for y in range(img.size[1]): # binaryzation
    List = []
    for x in range(img.size[0]):
        if pixelArray[x,y] < threshold:
            List.append(0)
        else:
            List.append(256)
    table.append(List)

img = Image.fromarray(np.array(table))
img.show()

def operation(image):
    resultList = []
    pixelList = image.load()
    flag = False
    for y in range(image.size[1]):
        temp = []
        linePixel = 0
        for x in range(image.size[0]):
            if not pixelList[x,y]:
                linePixel += 1
            temp.append(pixelList[x,y])
        if linePixel >= 35: # judge the black dot in one line
            flag = True
            resultList.append(temp)
        elif flag:
            # resultList.append([0]*image.size[0]) # to check the handling lines
            flag = False
        else:
            resultList.append([256] * image.size[0])
    return Image.fromarray(np.array(resultList))

for i in range(6):
    img = operation(img)

img.show()
print(pytesseract.image_to_string(img,config='--psm 6'))

Первая мера для обработки (двоичная обработка):

enter image description here

Вторая мера состоит в том, чтобы удалить белую линию (оцените черные пиксели в одной строке):

enter image description here

И, наконец, результат:

"RVC
64.80%"
...