#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:
попытайтесь:
- удалите все строки.
- соедините компоненты (числа) по вертикали.
- найдите контуры (столбцы текста) и отсортируйте их слева направо.
- нарежьте изображение в соответствии с контурами столбцов.
- передайте отдельные фрагменты в tesseract с соответствующими цифрами белого списка значений psm.
надеюсь, это решит вашу проблему.