我參與了一個項目,我認爲您可以幫助我。我有多個圖片,你可以在這裏看到Images to recognize。這裏的目標是提取虛線之間的數字。什麼是最好的方法來做到這一點?我從一開始就想到找到虛線的座標並執行裁剪功能,然後運行OCR軟件。但不容易找到這些座標,你能幫助我嗎?或者如果你有更好的方法告訴我。從特定圖片中提取數字
最好的問候,佩德羅 比門
我參與了一個項目,我認爲您可以幫助我。我有多個圖片,你可以在這裏看到Images to recognize。這裏的目標是提取虛線之間的數字。什麼是最好的方法來做到這一點?我從一開始就想到找到虛線的座標並執行裁剪功能,然後運行OCR軟件。但不容易找到這些座標,你能幫助我嗎?或者如果你有更好的方法告訴我。從特定圖片中提取數字
最好的問候,佩德羅 比門
您可以使用Python-正方體https://code.google.com/p/python-tesseract/,它與你的image.What你需要做的就是分裂的結果string.I使用https://www.dropbox.com/sh/kcybs1i04w3ao97/u33YGH_Kv6#f:euro9.jpg到test.And源代碼在下面。 UPDATE
# -*- coding: utf-8 -*-
from PIL import Image
from PIL import ImageEnhance
import tesseract
im = Image.open('test.jpg')
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(4)
im = im.convert('1')
w, h = im.size
im = im.resize((w * (416/h), 416))
pix = im.load()
LINE_CR = 0.01
WHITE_HEIGHT_CR = int(h * (20/416.0))
status = 0
white_line = []
for i in xrange(h):
line = []
for j in xrange(w):
line.append(pix[(j, i)])
p = line.count(0)/float(w)
if not p > LINE_CR:
white_line.append(i)
wp = None
for i in range(10, len(white_line) - WHITE_HEIGHT_CR):
k = white_line[i]
if white_line[i + WHITE_HEIGHT_CR] == k + WHITE_HEIGHT_CR:
wp = k
break
result = []
flag = 0
while 1:
if wp < 0:
result.append(wp)
break
line = []
for i in xrange(w):
line.append(pix[(i, wp)])
p = line.count(0)/float(w)
if flag == 0 and p > LINE_CR:
l = []
for xx in xrange(20):
l.append(pix[(xx, wp)])
if l.count(0) > 5:
break
l = []
for xx in xrange(416-1, 416-100-1, -1):
l.append(pix[(xx, wp)])
if l.count(0) > 17:
break
result.append(wp)
wp -= 1
flag = 1
continue
if flag == 1 and p < LINE_CR:
result.append(wp)
wp -= 1
flag = 0
continue
wp -= 1
result.reverse()
for i in range(1, len(result)):
if result[i] - result[i - 1] < 15:
result[i - 1] = -1
result = filter(lambda x: x >= 0, result)
im = im.crop((0, result[0], w, result[-1]))
im.save('test_converted.jpg')
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetVariable("tessedit_char_whitelist", "abcdefghijklmnopqrstuvwxyz")
api.SetPageSegMode(tesseract.PSM_AUTO)
mImgFile = "test_converted.jpg"
mBuffer=open(mImgFile,"rb").read()
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
print "result(ProcessPagesBuffer)=",result
取決於蟒蟒2.7 - 正方體-win32的蟒蛇,OpenCV的numpy的PIL,並且一定要遵循蟒蛇,正方體的記得。
您可以從看圖像中更明顯(更大)的對象開始。一些圖像中的虛線太小。搜索「euros milhoes」徽標和條形碼將更容易,它將幫助您瞭解涉及的比例和旋轉。
要找到這些對象而不使用match template,可以對圖像進行二值化處理(注意背景紋理),並在輪廓/斑點上使用Hu矩。
不要指望數字小於8-10像素的圖像具有良好的OCR精度。
謝謝你的提示,但我的問題是裁剪虛線之間的圖像,因爲OCR得到與這些虛線的讀取錯誤。 – 2013-02-26 23:19:53
將徽標和條形碼的位置與旋轉和縮放比例一起後,即可應用[HorizontalRunLengthSmoothing](http://www.aforgenet.com/framework/docs/html/f61451b0-4f33-9f34-ca89-fb95ca040614 .htm)和[VerticalRunLengthSmoothing](http://www.aforgenet.com/framework/docs/html/249b205e-b7e5-5a70-0eef-65efa5e61da8.htm)用一個小的maxGapSize檢測虛線,然後用較大的maxGapSize 來檢測數字的位置。 – rold2007 2013-02-27 03:55:59
謝謝rold2007,我會試試這種方式。 – 2013-02-27 14:12:05
我瞭解你的工作,但你用虛線手動裁剪圖像。我想動態地做這個裁剪,因爲這個數字可以在其他座標中。 – 2013-02-26 17:13:05