【问题标题】:How can I improve OCR recognition?如何提高 OCR 识别率?
【发布时间】:2019-11-28 12:23:24
【问题描述】:

如图所示,我无法正确识别此类单词

结果我有这个:

RMACWI O
12X60
VPFZZOOIK
IADA50527
PORTES

我正在使用这些变量

ocr.SetVariable("tessedit_pageseg_mode", 10);
ocr.SetVariable("tessedit_char_whitelist", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-,.€"); 

有没有提高识别率的方法?

后来我对图像进行了二值化,但结果是最糟糕的!

结果:

RMACW1 0
TZXW
VPFZZDWK
IADASDEU
PORTES

【问题讨论】:

    标签: c# ocr tesseract emgucv


    【解决方案1】:

    您可以对图像进行预处理,但可以通过将 OCR 引擎更改为 Google cloud vision 来节省大量时间。当我运行您的图像时,它完美地检测到了文本:

    RMAC6010
    12X60
    VPF3200/K
    IADA50527
    PORTES
    Documentos refer
    Enc. Cli EC19/041
    

    设置 Google 云有点麻烦,但他们的 AI API 是世界上最好的。您可以测试您的图像here。他们有所有主要语言的客户端库。

    Google Cloud Vision Quick-start
    OCR w/ gcloud documentation

    【讨论】:

    • 我同意这一点,Tesseract 永远不会是完美的,并且总是会将某些字符误认为另一个字符。然而,由于法规,并非在所有情况下都可以使用这样的服务。
    • 啊,是的,他们的 TOS 非常严格,您可能无法将数据发送到云端。我想如果你想投入时间,你可以使用付费服务作为基本事实并重新训练你自己的 tesseract 权重。不过,我的留存效果并不好,而且需要很多时间。
    • @Viezevingertjes 谢谢你的回答。可能每月解决方案不会超过 1000 次......所以这是一个不错的选择
    【解决方案2】:

    裁剪、阈值化和调整图像大小可能会有所帮助。 Tesseract 最适合白色背景上的黑色文本。查看this 网站了解更多信息。

    【讨论】:

    • 我尝试对图像进行二值化,但结果最差。现在看看我的问题
    • 您仍然可以尝试裁剪和调整图像大小。你为什么使用pagesegmode 10?它表示“将图像视为单个字符”。您应该使用 6,或者,如果您将图像裁剪成行,则使用 7
    • 如何将图像裁剪成多行?
    • 只需剪切图像,使一张图像只有一行数字。您可以使用截图工具,或许多免费选项。
    • 添加到@JavierUrrestarazu 答案中,您还可以在将图像输入OCR 之前将其平滑作为最后一步
    【解决方案3】:

    您可以对二值图像应用轻微的高斯模糊。这将有助于平滑图像。结果如下:

    OCR 的结果

    RMAC6010
    
    12X60
    
    VPF3200/K
    \ADA50527
    
    PORTES
    Documentos refe:
    Ene. Cli EC 19/041
    

    我在 Python OpenCV + Pytesseract 中实现了它,但您可以将相同的策略应用到 C# 中

    import cv2
    import pytesseract
    
    pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
    
    # Load image and Otsu's Threshold to get a binary image
    image = cv2.imread('1.jpg', 0)
    thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    
    # Gaussian blur and then perform OCR
    thresh = cv2.GaussianBlur(thresh, (3,3), 0)
    data = pytesseract.image_to_string(thresh, lang='eng', config='--psm 6')
    print(data)
    
    cv2.imshow('thresh', thresh)
    cv2.waitKey()
    

    【讨论】:

    • 感谢您的回答!现在我正在使用System.Drawing.Size kSize = new System.Drawing.Size(3, 3); Image<Gray, byte> grayImg = temp.Convert<Gray, byte>(); Image<Gray, byte> binImg = new Image<Gray, byte>(grayImg.Size); Image<Gray, byte> gaussImg = new Image<Gray, byte>(grayImg.Size); CvInvoke.Threshold(grayImg, binImg, 0, 255, ThresholdType.Binary | ThresholdType.Otsu); CvInvoke.GaussianBlur(binImg,gaussImg, kSize, 0); 但结果不像你的......
    • C# OpenCV 实现可能与 Python 版本不同
    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 2018-07-03
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多