我正在使用包含文字的图片。问题是这些图像是收据,经过大量的转换后,文本质量下降。 我正在使用python和opencv。 我正在尝试使用文档Morphological Transformations中的许多形态转换组合,但我没有得到满意的结果。
我现在正在这样做(我会评论我尝试过的内容,并且只是取消评论我正在使用的内容):
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()
有了这个,从这张原始图片:
我明白了:
正如你所看到的那样好一点。但它仍然太糟糕了。 OCR(tesseract)不能很好地识别这里的角色。我已经训练过,但是你可以注意到,每个“e”都是不同的,依此类推。
我得到了很好的结果,但我想,如果我解决了这个问题,他们会更好。
也许我可以做另一件事,或者使用形态转换的更好组合。如果我可以使用其他工具(PIL,imagemagick等),我可以使用它。
这是整个图像,所以你可以看到它的外观:
正如我所说的那样,它并不是那么糟糕,但对字母的“优化”会更加完美。
答案 0 :(得分:1)
经过多年这个主题的工作,我现在可以告诉我,我想做的事情需要付出很大的努力,而且速度很慢,而且从未像我预期的那样工作。字符中像素的不规则性总是不可预测的,这就是“简单算法”不起作用的原因。
问题:那么拥有一个可以读取受损角色的体面OCR是不可能的吗?
答案:不,这不是不可能的。但它需要“一点点”,而不仅仅是使用侵蚀,形态学关闭或类似的东西。
那么,怎么样?神经网络:)这是两篇很有帮助的论文:
Can we build language-independent OCR using LSTM networks?
Reading Scene Text in Deep Convolutional Sequences
对于那些不熟悉RNN的人,我可以建议:
还有一个python库,它工作得很好(不幸的是,对C ++来说更好):
我真的希望这可以帮助别人。
答案 1 :(得分:0)
您是否考虑了相邻像素并添加了它们的总和。
例如:
{{1}}
此外,您可以numpy或cv2添加数组。
答案 2 :(得分:0)
根据我的经验,侵蚀会损害OCR质量。如果您有灰度图像(非二进制),则可以使用更好的二值化算法。我使用SAUVOLA算法进行二值化。如果您只有二进制图像,那么您可以做的最好的事情是消除噪音(删除所有小点)。
答案 3 :(得分:0)
我发现Ramer–Douglas–Peucker Algorithm我试图在Haskell中为封闭多边形实现它。也许它可以解决一些问题。