извлечение времени из изображений с помощью pytesseract в Python

#python #image-processing #ocr

#python #обработка изображений #распознавание

Вопрос:

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

Код, который я использовал, выглядит следующим образом:

 import pytesseract
from PIL import Image, ImageOps

im = Image.open(r'im.jpg')    
im_invert = ImageOps.invert(im)
text = pytesseract.image_to_string(im_invert)
print(text)
 

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

исходное изображение

Изображение после операции инверсии:

изображение после инверсии

Когда я запустил приведенный выше код, единственное, что я получил, это

введите описание изображения здесь

Что-то не так с моим кодом?

Ответ №1:

Если вы можете использовать EasyOCR, то этот подход ниже работает для вашего входного изображения.

Я протестировал данное исходное изображение в Google colab. Для локального отображения выходных изображений используйте cv2.imshow(...) и cv2.waitkey(0) .

Здесь сначала к изображению в оттенках серого применяется медианное размытие. Затем применяется пороговое значение, размывание и расширение. Median Blur Thresholding выдает почти такую же достоверность, как Median Blur Thresholding Erosion Dilation и в этом случае.

Изображение

введите описание изображения здесь

Прогнозирование распознавания, включая достоверность

 Thresholding:
[([[3, 1], [270, 1], [270, 60], [3, 60]], '09:01:00', 0.797291100025177)]
 
 Erosion:
[([[2, 2], [270, 2], [270, 58], [2, 58]], '09:01:00', 0.4145631492137909)]
 
 Dilation:
[([[3, 1], [270, 1], [270, 60], [3, 60]], '09:01:00', 0.7948697805404663)]
 

Код

 import cv2
import easyocr
import numpy as np
from PIL import Image
from google.colab.patches import cv2_imshow

# need to run only once to load model into memory
reader = easyocr.Reader(['ch_sim','en']) 
 
 img = cv2.imread('1.jpg', 0)
img = cv2.medianBlur(img, 5)

ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

#th1 = cv2.bitwise_not(th1)
kernel = np.ones((3,3), np.uint8)
erosion = cv2.erode(th1, kernel, iterations = 1)
dilation = cv2.dilate(erosion, kernel, iterations = 1)

print("Thresholding:n")
cv2_imshow(th1)
print("nErosion:n")
cv2_imshow(erosion)
print("nDilation:n")
cv2_imshow(dilation)
 
 print("Thresholding:")
result = reader.readtext(th1)
print(result)

print("Erosion:")
result = reader.readtext(erosion)
print(result)

print("Dilation:")
result = reader.readtext(dilation)
print(result)