提高图像中字母的质量

Chu*_*lar 5 python opencv image letters

我正在处理带有文本的图像。问题是这些图像是收据,经过大量转换后,文本失去了质量。我正在使用 python 和 opencv。我尝试使用形态转换文档中的多种形态转换组合,但没有得到满意的结果。

我现在正在这样做(我将评论我尝试过的内容,并取消评论我正在使用的内容):

kernel = np.ones((2, 2), np.uint8)
# opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# dilation = cv2.dilate(opening, kernel, iterations=1)
# kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
# gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
#
img = erosion.copy()
Run Code Online (Sandbox Code Playgroud)

这样,从这张原始图像中:

在此输入图像描述

我明白了:

在此输入图像描述

正如您所看到的,情况好一点了。但还是太糟糕了。OCR(tesseract)不能很好地识别这里的字符。我已经训练过,但正如你所注意到的,每个“e”都是不同的,等等。

我得到了很好的结果,但我想,如果我解决这个问题,他们会更好。

也许我可以做另一件事,或者使用更好的形态转换组合。如果有其他我可以使用的工具(PIL、imagemagick 等),我可以使用它。

这是整个图像,您可以看到它的外观:

在此输入图像描述

正如我所说,这还不错,但对字母进行更多“优化”就更完美了。

Chu*_*lar 3

在这个主题上工作了多年之后,我现在可以说,我想做的事情需要付出很大的努力,它非常缓慢,而且从来没有像我预期的那样有效。字符中像素的不规则性总是不可预测的,这就是“简单算法”不起作用的原因。

问:那么不可能有一个像样的OCR可以读取损坏的字符吗?

答:不,这并非不可能。但仅仅使用侵蚀、形态闭合或类似的东西需要“一点”。

那么,如何呢?神经网络 :)

这里有两篇精彩的论文对我帮助很大:

我们可以使用 LSTM 网络构建与语言无关的 OCR 吗?

读取深度卷积序列中的场景文本

对于那些不熟悉 RNN 的人,我可以建议:

了解 LSTM 网络

还有一个 python 库,它运行得很好(不幸的是,对于 C++ 甚至更好):

解剖学

我真的希望这可以帮助别人。