0

私はあなたが私を助けることができると思うプロジェクトに関わっています。ここに表示される複数の画像があります。認識できる画像。ここでの目標は、破線の間の数字を抽出することです。それを行うための最良のアプローチは何ですか?私が最初から持っているアイデアは、破線の座標を見つけてトリミング機能を実行し、次にOCRソフトウェアを実行することです。しかし、それらの座標を見つけるのは簡単ではありません、あなたは私を助けることができますか?または、より良いアプローチがある場合は教えてください。

よろしく、ペドロピメンタ

4

2 に答える 2

0

python-tesseract https://code.google.com/p/python-tesseract/を使用できます。イメージで動作します。必要なことは、結果の文字列を分割することです。https://www. dropbox.com/sh/kcybs1i04w3ao97/u33YGH_Kv6#f:euro9.jpgでテスト。ソースコードは以下。アップデート

# -*- 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", "0123456789abcdefghijklmnopqrstuvwxyz")
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

python 2.7 python-tesseract-win32 python-opencv numpy PIL に依存し、必ず python-tesseract の忘れないようにしてください。

于 2013-02-26T02:48:05.447 に答える
0

画像内のより明白な (より大きな) オブジェクトを見ることから始めることができます。一部の画像では破線が小さすぎます。「euros milhoes」のロゴとバーコードを検索する方が簡単で、関連する縮尺と回転を理解するのに役立ちます。

一致テンプレートを使用せずにこれらのオブジェクトを見つけるには、画像を 2 値化し (背景テクスチャに注意してください)、輪郭/ブロブで Hu モーメントを使用します。

数値が 8 ~ 10 ピクセルより小さい画像では、OCR の精度は期待できません。

于 2013-02-26T20:08:53.037 に答える