Python 扫描不良的手写数字的预处理

Python 扫描不良的手写数字的预处理,python,opencv,ocr,Python,Opencv,Ocr,我有几千个PDF文件,其中包含来自数字化纸质表单的黑白图像(1bit)。我正在尝试OCR一些字段,但有时文字太模糊: 我刚刚学习了形态学变换。他们真的很酷!!!我觉得我在滥用它们(就像我学习Perl时对正则表达式所做的那样) 我只对2017年6月7日的日期感兴趣: im = cv2.blur(im, (5, 5)) plt.imshow(im, 'gray') 填这张表格的人似乎对表格有些漠视,所以我试着把它去掉。我可以通过此变换隔离水平线: horizontal = cv2.morph

我有几千个PDF文件,其中包含来自数字化纸质表单的黑白图像(1bit)。我正在尝试OCR一些字段,但有时文字太模糊:

我刚刚学习了形态学变换。他们真的很酷!!!我觉得我在滥用它们(就像我学习Perl时对正则表达式所做的那样)

我只对2017年6月7日的日期感兴趣:

im = cv2.blur(im, (5, 5))
plt.imshow(im, 'gray')

填这张表格的人似乎对表格有些漠视,所以我试着把它去掉。我可以通过此变换隔离水平线:

horizontal = cv2.morphologyEx(
    ~thresh, 
    cv2.MORPH_OPEN, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (100, 1)),
)
plt.imshow(horizontal, 'gray')

我还可以得到垂直线:

plt.imshow(horizontal ^ ~thresh, 'gray')

ret, thresh2 = cv2.threshold(roi, 127, 255, 0)
vertical = cv2.morphologyEx(
    ~thresh2, 
    cv2.MORPH_OPEN, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (2, 15)), 
    iterations=2
)
vertical = cv2.morphologyEx(
    ~vertical, 
    cv2.MORPH_ERODE, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))
)
horizontal = cv2.morphologyEx(
    ~horizontal, 
    cv2.MORPH_ERODE, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
)
plt.imshow(vertical & horizontal, 'gray')

现在我可以摆脱网格了:

plt.imshow(horizontal & vertical & ~thresh, 'gray')

我得到的最好的是这个,但4个仍然分为2个部分:

plt.imshow(cv2.morphologyEx(im2, cv2.MORPH_CLOSE, 
    cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))), 'gray')

在这一点上,可能最好使用
cv2.findContours
和一些启发式方法来定位每个数字,但我想知道:

  • 我应该放弃并要求所有文档以灰度重新扫描吗
  • 是否有更好的方法来分离和定位微弱的手指
  • 你知道任何形态变换来连接像“4”这样的情况吗
  • [更新]


    重新扫描文档是否要求太高?如果这不是什么大麻烦,我相信获得更高质量的输入比训练和尝试改进模型以承受噪音和非典型数据要好

    一点背景:我在巴西的一家公共机构里是个无名小卒。ICR解决方案的价格从6位数开始,因此没有人相信一个人可以在内部编写ICR解决方案。我很天真,相信我能证明他们是错的。这些PDF文档放在FTP服务器上(大约10万个文件),被扫描只是为了去除死树版本。也许我可以得到原始表格,自己再扫描一遍,但我必须请求一些官方支持——因为这是公共部门,我希望尽可能地将这个项目隐藏起来。我现在得到的是50%的错误率,但如果这种方法是一条死胡同,那么尝试改进它是没有意义的

    也许是什么? 例如,我发现这个库:

    拿了你最后的“4”号:

    经过一些快速调整(没有真正理解参数,因此可能得到更好的结果),我得到了以下结果:

    使用以下代码(我还稍微侵入了morphsnakes.py以保存图像):


    重新扫描文档是否要求太高?如果这不是什么大麻烦,我相信获得更高质量的输入比培训和尝试改进模型以承受噪音和非典型性干扰要好data@GrayCygnus当前位置我将不得不穿越官僚主义和惰性的海洋,但这是可能的。我可能不得不自己做所有的手工工作。我也建议你看看这个(与我在回答上一个问题时链接的来源相同),他们介绍Tesseract(谷歌OCR引擎的包装)作为一个伟大的OCR工具。此外,我发现这也解释了如何使用具有欧几里德距离度量的K近邻来改进字符识别。祝你穿越海洋好运:)顺便说一句,我已经成功地使用了
    pytesseract
    来获取打印的表单编号。我已经成功地将70000张图像与专业打字员提供的数据库中的相应记录链接起来。这已经很有用了,因为我发现很多文档应该在数据库中,但是没有。从政治上讲,这是一场赌博:我会写一个系统来揭露他们的错误,以此来制造一些敌人,所以我希望展示一些其他的东西。手写识别是神经网络应该擅长的事情,并且有很多免费的.net实现;而且他们通常会将字符识别样本集作为他们的“目标”示例。
    plt.imshow(cv2.morphologyEx(im2, cv2.MORPH_CLOSE, 
        cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))), 'gray')
    
    import morphsnakes
    
    import numpy as np
    from scipy.misc import imread
    from matplotlib import pyplot as ppl
    
    def circle_levelset(shape, center, sqradius, scalerow=1.0):
        """Build a binary function with a circle as the 0.5-levelset."""
        grid = np.mgrid[list(map(slice, shape))].T - center
        phi = sqradius - np.sqrt(np.sum((grid.T)**2, 0))
        u = np.float_(phi > 0)
        return u
    
    #img = imread("testimages/mama07ORI.bmp")[...,0]/255.0
    img = imread("four.png")[...,0]/255.0
    
    # g(I)
    gI = morphsnakes.gborders(img, alpha=900, sigma=3.5)
    
    # Morphological GAC. Initialization of the level-set.
    mgac = morphsnakes.MorphGAC(gI, smoothing=1, threshold=0.29, balloon=-1)
    mgac.levelset = circle_levelset(img.shape, (39, 39), 39)
    
    # Visual evolution.
    ppl.figure()
    morphsnakes.evolve_visual(mgac, num_iters=50, background=img)