Как определить числа внутри желтого куба с помощью pytesseract

#python #numpy #python-tesseract

#python #numpy #python-тессеракт

Вопрос:

Итак, я попытался определить число (1-9) внутри желтого куба, но без твердого раствора..

Это две мои фотографии

4

6

Это одно из решений, которое я пытался, но безуспешно

 from PIL import Image
from operator import itemgetter
import numpy as np 
import easyocr
import cv2 
import re
import imutils
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCRtesseract'

img = cv2.imread("ROI_0.png")
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thr = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
                            cv2.THRESH_BINARY_INV, 59, 88)
bnt = cv2.bitwise_not(thr)
txt = pytesseract.image_to_string(bnt, config="--psm 6 digits")
txt = txt.strip().split("n")
print(txt)
cv2.imshow("bnt", bnt)
cv2.waitKey(0)
 

Есть ли другой способ сделать это, потому что он не работает?

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

1. Вы проверили свои предварительно обработанные изображения, thr и bnt? он полностью черный, в нем нет текста. и, кроме того, адаптивный порог здесь не работает. Его следует использовать только в случае неравномерного освещения. Попробуйте бинаризацию otsu и исправьте перекос.

Ответ №1:

Шаги:

  1. Бинаризация (метод оцу)
  2. Исправьте перекос с помощью minarearrect
  3. Найти контур максимальной площади
  4. обрезать число
  5. переход обрезан до pytesseract
      image = cv2.imread("y6.png")
     # image = image_resize(image,width=480,height=640)
     gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
     thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY cv2.THRESH_OTSU)[1]
    
     contours = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
     big = max(contours,key=cv2.contourArea)
     (x,y),(w,h),angle = cv2.minAreaRect(big)
     print(angle)
    
     (h, w) = image.shape[:2]
     center = (w // 2, h // 2)
     M = cv2.getRotationMatrix2D(center, angle, 1.0)
     rotated = cv2.warpAffine(thresh, M, (w, h),flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_CONSTANT,borderValue=(0,0,0))
    
     big = cv2.findContours(rotated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
     big = max(big,key=cv2.contourArea)
     x,y,w,h = cv2.boundingRect(big)
    
     # cropped = rotated[y:y h,x:x w]
     cropped = rotated[y:y h-h//10,w//6:x w-w//6]
    
     data = pytesseract.image_to_string(cropped,config='--psm 6 digits')#  -c tessedit_char_whitelist = 0123456789')
     print(data)
     

Есть несколько жестко закодированных значений, таких как h // 10, и все они обрезаны. Поэтому необходима оптимизация.

Ответ №2:

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