2014-02-22 58 views
5

我试图从下面的图像的电话号码(后调整:) enter image description here
我的代码:OCR不与符号识别电话号码( - )

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 

返回空串。 当电话号码中没有( - )时,它会正确返回。 我该怎么办? 谢谢!

+0

“ - ”是否总是在同一个地方?如果是这种情况,您可以分割图像几次以删除“ - ”,然后连接每个单独图像上运行OCR的结果。 –

+0

你能提供一个代码示例吗? – Sekai

+0

已提供一些代码 - 请查看 –

回答

4

好吧,当我用tesseract运行你的代码时,你提供的图像完美地返回了文本(包括破折号和空格)。在这一点上,你显然可以使用txt = txt.replace("-", "").replace(" ", "")来摆脱破折号和空格。

Buuuuuut我知道OCR(即使与我们都使用tesseract)跨平台会有所不同,所以我已经包含了我的评论建议的示例。

首先,我们在划线分割的影像,然后我们读到每个分割图像,然后我们串接:

# 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 

工作就像一个魅力对我来说:

希望这有助于!

+0

+1了解详细的答案! 我现在就试试,我只想指出我没有对我的OCR进行任何培训,对吧? – Sekai

+0

@Sekai Nope甚至没有安装tesseract,直到我意识到我需要它来运行你的代码。也许全新安装对你有帮助? –

+0

如果它起作用,则应将其标记为已接受^ _ ^ –