如何从文本图像中删除虚线带?

Posted

技术标签:

【中文标题】如何从文本图像中删除虚线带?【英文标题】:How to remove dotted band from text image? 【发布时间】:2018-08-25 07:21:39 【问题描述】:

我正在处理的一个问题是对文档进行 OCR。一些 paystub 文档有一条带有点的突出显示线,以区分重要元素,如总工资、净工资等。

这些点在 OCR 中会给出错误的结果,它会将它们视为 ':' 字符并且不会给出所需的结果。我已经尝试了很多用于图像处理的东西,例如 ImageMagick 等来去除这些点。但在每种情况下,整个文本数据的质量都会下降,从而导致 OCR 不佳。

我试过的ImageMagick命令是:

转换 mm150.jpg -kuwahara 3 mm2.jpg

我也尝试过连接组件、内核侵蚀等,但每种方法都以某种方式失败。

我想知道我是否应该遵循某种方法,或者我是否缺少图像处理功能中的某些东西。

【问题讨论】:

这个分辨率太荒谬了。即使是便宜的扫描仪也可以轻松实现 2000-4000 dpi。你的扫描在我看来更像是 100 dpi。我看到的唯一方法是训练一些自定义 OCR 在嘈杂的背景下读取这些数字。废话=废话 这实际上是一个屏幕截图,我已经更新了图像。它的分辨率非常好。 假设此页面是 A4、US letter 或类似页面,我们在 8 英寸的纸张上有 1700 个像素。那是213dpi的分辨率,非常差。我的意思是你的字符线是 1 像素宽......但不管黑点的大小和饱和度与你的字符相同。这使得几乎不可能在不删除大部分字符的情况下消除噪音。您需要针对该问题量身定制的定制解决方案。或者让人们以数字方式发送这些东西。我的意思是这是 2018 年。 【参考方案1】:

这个问题可以使用opencv的connectedComponentsWithStats函数解决。我从这个问题How do I remove the dots / noise without damaging the text? 中找到了参考

我根据自己的需要对其进行了一些更改。这是帮助我获得所需输出的代码。

    import cv2
    import numpy as np
    import sys

    img = cv2.imread(sys.argv[1], 0)
    _, blackAndWhite = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)


    nlabels, labels, stats, centroids = cv2.connectedComponentsWithStats(blackAndWhite, 4, cv2.CV_32S)
    sizes = stats[1:, -1] #get CC_STAT_AREA component
    img2 = np.zeros((labels.shape), np.uint8)

    for i in range(0, nlabels - 1):
        if sizes[i] >= 8:   #filter small dotted regions
            img2[labels == i + 1] = 255

    res = cv2.bitwise_not(img2)

    cv2.imwrite('res.jpg', res)

我得到的输出文件非常清晰,去除了虚线带,例如它提供了完美的 OCR 结果。

【讨论】:

有效,但 for 循环非常慢 - 关于如何在实践中加速它的任何想法?

以上是关于如何从文本图像中删除虚线带?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Visual Studio 的文本编辑器中删除虚线?

JavaScript [mootools]从点击的链接图像中删除onfocus虚线轮廓

如何删除焦点按钮文本周围的虚线白色边框

ios中uilabel中的虚线文本

CSS 删除图像上的虚线边框(例如,在Firefox中)

如何从 Apple 键盘听写中删除 TextView 中的蓝色虚线建议下划线?