【问题标题】:Extract numbers from specific image从特定图像中提取数字
【发布时间】:2013-02-26 01:59:52
【问题描述】:

我参与了一个我认为您可以帮助我的项目。我有多张图片,你可以在这里看到Images to recognize。这里的目标是提取虚线之间的数字。最好的方法是什么?我一开始的想法是找到虚线的坐标并做裁剪功能,然后只是运行OCR软件。但是找到那些坐标并不容易,你能帮帮我吗?或者如果你有更好的方法告诉我。

最好的问候, 佩德罗·皮门塔

【问题讨论】:

    标签: numbers ocr detect image-recognition


    【解决方案1】:

    您可以从查看图像中更明显(更大)的对象开始。在某些图像中,虚线太小了。搜索“euros milhoes”标志和条形码会更容易,它会帮助您了解所涉及的比例和旋转。

    要在不使用match template 的情况下找到这些对象,您可以对图像进行二值化(注意背景纹理)并在轮廓/斑点上使用 Hu 矩。

    不要指望数字小于 8-10 像素的图像具有良好的 OCR 精度。

    【讨论】:

    • 感谢您的提示,但我的问题是裁剪虚线之间的图像,因为 OCR 会读取这些虚线的错误。
    • 一旦您有了徽标和条形码的位置以及旋转和缩放比例,您可以应用 HorizontalRunLengthSmoothingVerticalRunLengthSmoothing 并使用较小的 maxGapSize 来检测虚线,然后使用较大的 maxGapSize检测数字的位置。
    • 谢谢rold2007,我会试试的。
    【解决方案2】:

    您可以使用 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的记住

    【讨论】:

    • 我了解您的工作,但您通过虚线手动裁剪图像。我想动态地进行这种裁剪,因为这个数字可以在其他坐标中。
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多