Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OCR doesn't recognize phone numbers with the sign (-)

Tags:

python

ocr

I'm trying to extract phone number from the following image (after resize:) enter image description here
my code :

from PIL import Image
from pyocr import pyocr
import pyocr.builders
import cStringIO
import os
os.putenv("TESSDATA_PREFIX", "/usr/share/tesseract-ocr/")
tools = pyocr.get_available_tools()
tool = tools[0]
langs = tool.get_available_languages()
lang = langs[0]
file = "test.png"
txt = tool.image_to_string(Image.open(file),
                           lang=lang,
                            builder=pyocr.builders.TextBuilder())
print txt

it returns Empty string. When there is no (-) in the phone number, it returns it correctly. What should I do ? Thanks !

like image 760
Aysennoussi Avatar asked Feb 22 '14 14:02

Aysennoussi


1 Answers

Okay, when I ran your code with tesseract and the image you provided it perfectly returned the text (dashes and spaces included). At that point you could obviously just use txt = txt.replace("-", "").replace(" ", "") to get rid of the dashes and whitespace.

Buuuuuut I know that OCR (even with us both using tesseract) is going to be different across platforms, so I've included an example of my comment suggestion.

First we split the images at the dashes, then we read each split image, then we concatenate:

# I changed your imports a bit
from PIL import Image
from pyocr import pyocr
from pyocr import builders
import cStringIO
import os

# set up all your OCR stuff
os.putenv("TESSDATA_PREFIX", "/usr/share/tesseract-ocr/")
tools = pyocr.get_available_tools()
tool = tools[0]
langs = tool.get_available_languages()
lang = "eng" #set language to english to simplify things

# definte a function to return the text of a given image
def doOCR( fName ):
    txt = tool.image_to_string(Image.open(fName), lang=lang, builder=builders.TextBuilder())
    return txt

# define the path of the image we are going to read
path = "test.png"

# get the image dimensions
im = Image.open(path)
width, height = im.size

# define the points we want to split the image at
# these are the points where the dashes are
split_points = [119, 158]

# define the file names for the image parts
split_names = ["split-1.png", "split-2.png", "split-3.png"]

# define a function to crop the image and remove the dashes
def doCrop(imagePath, cropPath, x, y, x2, y2):
    im = Image.open(imagePath)
    box = (x, y, x2, y2)
    region = im.crop(box) # extract the box region
    region.save(cropPath) # save it as a separate image

# in the image you provided each "-" is ~10 pixels long
lenpix = 10

# crop the image at the split points
doCrop(path, split_names[0], 0, 0, split_points[0], height) # get the first section
doCrop(path, split_names[1], split_points[0] + lenpix, 0, split_points[1], height) # get the middle section
doCrop(path, split_names[2], split_points[1] + lenpix, 0, width, height) # get the final section

# define a variable for our final value
finalValue = ""

# finally iterate through split files
# and add the OCR results from each split together
for f in split_names:
    finalValue += doOCR(f) # concatenate the ocr value with the final
    os.remove(f) # remove the split file now that we've used it

# display the final value
print finalValue

Worked like a charm for me:

Hope this helped!

like image 71
John Dorian Avatar answered Oct 12 '22 00:10

John Dorian