Извлечение числа из изображения с помощью 2D-массива с использованием тессеракта Python - PullRequest
0 голосов
/ 28 мая 2018

Во время извлечения целых чисел из изображения, содержащего форму 2D-матрицы, Тессеракт не может дать правильный результат, и результат меняется каждый раз, когда мы выполняем код. Может кто-нибудь, пожалуйста, дайте некоторое представление о том, чего не хватает в коде ниже

img = cv2.imread(img_path)
rows = img.shape[0]
cols = img.shape[1]

#print rows , cols

img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# Apply dilation and erosion to remove some noise
#kernel = np.ones((5,5), np.uint64)
#img = cv2.dilate(img, kernel, iterations=1)
#img = cv2.erode(img, kernel, iterations=1)

# Write image after removed noise

cv2.imwrite(src_path + "removed_noise1.png", img)

#  Apply threshold to get image with only black and white
#img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,225,95)
img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C , cv2.THRESH_BINARY ,251,95)
#print cv2.getGaussianKernel(ksize=221,sigma=41)

# Write the image after apply opencv to do some ...
cv2.imwrite(src_path + "thres1.png", img)

# Recognize text with tesseract for python  
result = pytesseract.image_to_string(Image.open(src_path + "thres1.png"))

Ввод

enter image description here

Пороговое значение: adaptiveThreshold (img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 251, 95

Выходной порог:
enter image description here

Выход имеет вид 1 5 5 7 5 7 3 8 6 4 9 0 2 4 8 6 1 3 0 23 9 0 8 9 может быть либо в основной форме строки, и в основной форме столбца не имеет значения, но нам нужно, чтобы данный вывод был сохранен в переменную

1 Ответ

0 голосов
/ 28 мая 2018

Попробуйте изменить пороговое значение с 251, 95 до 251, 40.

img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C , cv2.THRESH_BINARY ,251,40)

Кажется, у вас уже есть идеальное изображение, которое не требует каких-либо изменений для извлечения строки из изображения.Image_to_string Pytesseract не работает в моей системе, поэтому я использовал чей-то слово за словом OCR.Это определенно не лучшее решение в мире, эй, если оно работает, оно работает.Я приложил несколько файлов (см. Ссылки на диске Google ниже)

Шаги:

  1. Запустите slice_img.py: это разбьет ваше изображение на 5x5 частей.
  2. Запустите TrainAndTest.py: он извлечет числа из каждого созданного нами фрагмента изображения и сохранит его в файле data.txt.

Обратите внимание:

  1. Training_chars.png, classifications.txt и flatered_images.txt - это файлы, необходимые для работы OCR.
  2. Для работы вышеуказанного скрипта должны быть установлены библиотеки numpy, PIL, OpenCV
  3. Пожалуйста, держите все файлы в одной папке и используйте имя изображения в качестве test.png

TrainAndTest.py - https://drive.google.com/file/d/0B05aeuFExe2Aa3p3SWszN2xqU2c/view?usp=sharing
slice_image.py - https://drive.google.com/file/d/0B05aeuFExe2AN0t3UUlGZ3VjcW8/view?usp=sharing
training_chars.png - https://drive.google.com/file/d/0B05aeuFExe2ANjJNbzV5VTJyRTA/view?usp=sharing
classifications.txt - https://drive.google.com/file/d/0B05aeuFExe2AZU91bUpOblB3d2c/view?usp=sharing
flatered_images.txt - https://drive.google.com/file/d/0B05aeuFExe2AeXVnbXVXVTZ2RTQ/view?usp=sharing

...