如何从文本图像中删除虚线带?
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 的文本编辑器中删除虚线?