Tesseract does not recognize single characters
Asked Answered
S

5

24

How to represent:

  1. Create new image with paint (any size)
  2. Add letter A to this image
  3. Try to recognize -> tesseract will not find any letters
  4. Copy-paste this letter 5-6 times to this image
  5. Try to recognize -> tesseract will find all the letters

Why?

Siphon answered 9/3, 2012 at 9:55 Comment(0)
T
25

You must set the "page segmentation mode" to "single char".

For example, in Android you do the following:

api.setPageSegMode(TessBaseAPI.pageSegMode.PSM_SINGLE_CHAR);
Tarbes answered 3/12, 2013 at 13:23 Comment(4)
Thanks! Setting PageSegMode.SingleChar fixed the issue.Flask
api.SetPageSegMode(tesseract::PSM_SINGLE_CHAR); for C++ users ;)Tricycle
The equivalent command line parameter: --psm 10Ehudd
engine.DefaultPageSegMode = PageSegMode.SingleChar; for C# users (engine is TesseractEngine)Tactician
C
16

python code to do that configuration is like this:

import pytesseract
import cv2
img = cv2.imread("path to some image")
pytesseract.image_to_string(
     img, config=("-c tessedit"
                  "_char_whitelist=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
                  " --psm 10"
                  " -l osd"
                  " "))

the --psm flag defines the page segmentation mode.

according to documentaion of tesseract, 10 means :

Treat the image as a single character.

so to recognize a single character you just need to use : --psm 10 flag.

Chokebore answered 12/10, 2018 at 9:14 Comment(0)
G
10

You need to set Tesseract's page segmentation mode to "single character."

Gouty answered 5/6, 2012 at 7:13 Comment(3)
Well, it depends entirely on how you're using tesseract. If you're calling it from the shell, you would say tesseract $image $outbase -psm 10. The -psm sets the page segmentation mode, and mode 10 is for single characters. It's all in the man page.Planet
In some cases, mode 13 works better. Alternatively make the image smaller/larger might help.Lactobacillus
setting the psm to 10 does not seem to make a difference. My use case is a single large character on a larger white background. A clear 'A' in this example yields '-\n' with a psm of 10 at 200 DPI.Alfie
H
7

Have you seen this?

https://code.google.com/p/tesseract-ocr/issues/detail?id=581

The bug list shows it as "no longer an issue".

  • Be sure to have high resolution images.
  • If you are resizing the image, be sure to keep a high DPI and don't resize too small
  • Be sure to train your tesseract system
  • use the baseApi.setVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); code before the init Tesseract
  • Also, you may look into which font to use with OCR
Halfslip answered 9/3, 2012 at 20:49 Comment(0)
T
0

Other option is, in case if PageSegMode.SingleChar is still not working, to decrease colors of image (Binarization for example) and then use PageSegMode.SingleChar.

Tola answered 16/5, 2024 at 10:54 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.