Как я могу обнаружить и распознать цифры в ключе ответа, подобном данному изображению?

#python #image #opencv #image-processing #deep-learning

#python #изображение #opencv #обработка изображений #глубокое обучение

Вопрос:

У меня есть это изображение, и я должен обнаружить и сохранить ответы и соответствующий номер вопроса. Я пытался использовать OCR, но он ничего не распознал должным образом. Есть ли какой-либо другой способ?

 import cv2
from imutils import contours
import numpy as np
import pytesseract

config = '-l eng equ --oem 3 --psm 8'

# Load image, grayscale, and adaptive threshold
image = cv2.imread('answerkey.png')
original = image.copy()
original1= image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cv2.imshow("thresh",thresh)
cv2.waitKey(0)

# Filter out all numbers and noise to isolate only boxes
cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

(cnts,_) = contours.sort_contours(cnts, method="top-to-bottom")
(cnts,_) = contours.sort_contours(cnts, method="left-to-right")
print(cnts)
completetext=[]
for c in cnts:
    area = cv2.contourArea(c)
    if 500 < area <5000:
        # cv2.imshow("cnt", original)
        # cv2.waitKey(0)
        x,y,w,h = cv2.boundingRect(c)
        crop = original1[y:y h, x:x w]
        gray1 = cv2.cvtColor(crop, cv2.COLOR_BGR2GRAY)
        # cv2.imshow("cropp",crop)
        # cv2.waitKey(0)
        kernel = np.zeros((2,2), np.uint8)
        erode = cv2.erode(gray1, kernel,iterations=2)

        cv2.imshow("cropp erode", erode)
        cv2.waitKey(0)
        text = pytesseract.image_to_string(erode, config=config)
        print(text)
  

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

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

Комментарии:

1. Если вы избавитесь от строк, увеличите его в 3 раза и запустите с PSM 6, вы получите очень хорошее распознавание. Чтобы избавиться от строк, вы могли бы найти их с помощью четких строк и перезаписать эти разделы белыми пикселями. Чтобы убедиться, что вы не перезаписываете буквы, выбросьте короткие строки.

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

3. Tesseract предпочитает, чтобы символы имели минимальную высоту в пикселях. У вас изображение высокого качества, но высота букв составляла около 11 пикселей.

4. о да, я должен был тщательно изучить tess-doc. Спасибо, чувак

Ответ №1:

попытайтесь:

  1. удалите все строки.
  2. соедините компоненты (числа) по вертикали.
  3. найдите контуры (столбцы текста) и отсортируйте их слева направо.
  4. нарежьте изображение в соответствии с контурами столбцов.
  5. передайте отдельные фрагменты в tesseract с соответствующими цифрами белого списка значений psm.

надеюсь, это решит вашу проблему.