Как извлечь текст из изображения с небольшим фоновым присутствием? - PullRequest
0 голосов
/ 05 февраля 2019

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

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

Изображение всегда будет горизонтальным, никакого другого текста, кроме цифр, не будет.Максимальное число увеличится до 55000.

Пример изображения:

После обработки изображения мое изображениеувеличивается на 4 по осям X и Y.И некоторая насыщенность удаляется, хотя это совсем не повышает точность.

image = self._process(scale=6, iterations=2)
text = pytesseract.image_to_string(image, config="--psm 7")

Мой метод процесса делает следующее:

# Resize and desaturate.
image = cv2.resize(image, None, fx=scale, fy=scale, 
interpolation=cv2.INTER_CUBIC)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Apply dilation and erosion.
kernel = np.ones((1, 1), np.uint8)
image = cv2.dilate(image, kernel, iterations=iterations)
image = cv2.erode(image, kernel, iterations=iterations)

return image

Ожидается: "10411"

Фактическое значение варьируется, обычно это неузнаваемая строка, или некоторые числа анализируются, но коэффициент точности слишком низок, чтобы его можно было использовать.

1 Ответ

0 голосов
/ 06 февраля 2019

У меня нет опыта работы с OCR, но я думаю, что вы на правильном пути: увеличьте размер изображения, чтобы у алгоритма было больше пикселей для работы, и увеличьте разницу между числами и фоном.

Уловки, которые я добавил: thresholding изображение, которое создает маску, в которой остаются только белые пиксели.Было несколько белых пятен, которые не были числами, поэтому я использовал findContours , чтобы закрасить эти нежелательные капли черным.

Результат:

enter image description here

Код:

import numpy as np 
import cv2
# load image
image = cv2.imread('number.png')
# resize image
image = cv2.resize(image,None,fx=5, fy=5, interpolation = cv2.INTER_CUBIC)
# create grayscale
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# perform threshold
retr, mask = cv2.threshold(gray_image, 230, 255, cv2.THRESH_BINARY)
# find contours
ret, contours, hier = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# draw black over the contours smaller than 200 - remove unwanted blobs
for cnt in contours:
    # print contoursize to detemine threshold
    print(cv2.contourArea(cnt))
    if cv2.contourArea(cnt) < 200:
         cv2.drawContours(mask, [cnt], 0, (0), -1)

#show image
cv2.imshow("Result", mask)
cv2.imshow("Image", image)

cv2.waitKey(0)
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...