我一直在尝试使用图像处理脚本/ OCR,它允许我从下图中的框中提取字母(使用tesseract
)。
经过大量处理,我能够让图片看起来像这样
为了消除噪音,我将图像反转,然后进行填充和高斯模糊以消除噪音。这就是我接下来的结果。
通过一些冲击和侵蚀来消除噪音(侵蚀是扭曲文本的步骤)之后我能够通过tesseract运行它之前使图像看起来像这样
这是一个非常好的渲染,通过tesseract可以获得相当准确的结果。虽然它有时会因为它将哈希(#)读为H或W而失败。这引出了我的问题!
有没有办法使用opencv,skimage,PIL(最好是opencv)我可以锐化这个图像以增加tesseract正确读取我的图像的机会?或者有没有办法从第三张图像到最终图像,而不必使用侵蚀,这最终会扭曲图像中的文本。
非常感谢任何帮助!
答案 0 :(得分:4)
OpenCV确实具有像filter2D这样的函数,可以将任意内核与给定图像进行卷积。特别是,您可以使用用于图像锐化的内核。主要问题是这是否会改善您的OCR库的结果。图像已经非常清晰,图像中的噪声不是模糊的结果。我从来没有和teseract一起工作,但我相信它已经完全降低了噪音。在这个过程中'帮助'他实际上可能会产生相反的效果。例如,任何锐化过程都倾向于放大噪声(与通常模糊图像的降噪过程相反)。当提供原始(未处理)图像时,大多数计算机视觉库都能提供更好的结果。
编辑(问题更新后): 有多种方法可以做到这一点。我要测试的第一个是:你的第一个二进制图像非常干净和清晰。而不是使用降低字母质量的形态操作切换到过滤轮廓。使用findContours功能查找图像中的所有轮廓并存储其层次结构(即哪个轮廓位于其中)。从所有找到的轮廓中,您实际上只需要第一和第二级别的轮廓,即每个字母的外部和内部轮廓(零级别的轮廓是最外面的轮廓)。其他轮廓可以丢弃。在属于第一级的轮廓中,您可以丢弃那些边界框太小而不能成为真正字母的轮廓。在这两个丢弃程序之后,我预计大多数剩余的轮廓都是字母的一部分。在白色图像上绘制它们并运行OCR。 (如果你想在黑色背景上使用白色字母,你需要反转轮廓中顶点的顺序。)