使用OpenCV OCR锐化图像

Jam*_*Lee 5 ocr opencv tesseract

我一直在尝试使用图像处理脚本/ OCR,它允许我tesseract从下图中的框中提取字母(使用).

http://i622.photobucket.com/albums/tt310/seraphelitis/rename_zps80dcdd06.png

经过大量的处理,我能够让图片看起来像这样

3

为了消除噪声,我将图像反转,然后进行填充和高斯模糊以消除噪声.这就是我接下来的结果.

4

在经过一些冲击和侵蚀来消除噪音(侵蚀是扭曲文本的步骤)后,我能够使图像看起来像这样,然后通过tesseract运行

在此输入图像描述

这是一个非常好的渲染,通过tesseract可以获得相当准确的结果.虽然它有时会因为它将散列(#)读为H或W而失败.这引出了我的问题!

有没有办法使用opencv,skimage,PIL(最好是opencv)我可以锐化这个图像,以增加tesseract正确读取我的图像的机会?或者有没有办法从第三张图像到最终图像,而不必使用侵蚀,最终扭曲图像中的文本.

任何帮助将不胜感激!

Mic*_*nov 4

OpenCV确实有类似filter2D的功能这样的函数,可以将任意内核与给定图像进行卷积。特别是,您可以使用用于图像锐化的内核。主要问题是这是否会改善 OCR 库的结果。图像已经相当清晰,图像中的噪点并不是模糊的结果。我自己从未使用过 teseract,但我相当确定它已经做到了它能做到的所有降噪功能。而在这个过程中“帮助”他,实际上可能会产生相反的效果。例如,任何锐化过程都会放大噪声(与通常使图像模糊的降噪过程相反)。大多数计算机视觉库在提供原始(未处理)图像时会给出更好的结果。

编辑(问题更新后):有多种方法可以做到这一点。我要测试的第一个是:您的第一个二进制图像非常干净和清晰。不使用降低字母质量的形态操作,而是改用过滤轮廓。使用findContours函数查找图像中的所有轮廓并存储它们的层次结构(即哪个轮廓在哪个轮廓内部)。从所有找到的轮廓中,您实际上只需要第一层和第二层的轮廓,即每个字母的外部和内部轮廓(零层的轮廓是最外层的轮廓)。其他轮廓可以被丢弃。在属于第一级的轮廓中,您可以丢弃那些边界框太小而不能成为真实字母的轮廓。在这两个丢弃过程之后,我预计大部分剩余的轮廓都是字母的一部分。将它们绘制在白色图像上并运行 OCR。(如果您想要黑色背景上的白色字母,则需要反转轮廓中顶点的顺序)。