#python #numpy #python-tesseract
#python #numpy #python-тессеракт
Вопрос:
Итак, я попытался определить число (1-9) внутри желтого куба, но без твердого раствора..
Это две мои фотографии
Это одно из решений, которое я пытался, но безуспешно
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:
Шаги:
- Бинаризация (метод оцу)
- Исправьте перекос с помощью minarearrect
- Найти контур максимальной площади
- обрезать число
- переход обрезан до 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 для обнаружения символа.