我正在尝试开发一个应用程序,它使用 Tesseract 来识别手机摄像头拍摄的文档中的文本。我使用 OpenCV 来预处理图像以实现更好的识别,应用高斯模糊和阈值方法进行二值化,但结果非常糟糕。
Here https://s6.postimg.cc/sft9tot9d/0_img02.png is the the image I'm using for tests:
And here https://s6.postimg.cc/mswww7qqp/2_img02_sharpened_threshold1.png the preprocessed image:
我还可以使用哪些其他过滤器来使图像对于 Tesseract 更具可读性?
我在这里描述了为 Tesseract 准备图像的一些技巧:使用tesseract识别车牌 https://stackoverflow.com/questions/19268648/using-tesseract-to-recognize-license-plates/19418347#19418347
在您的示例中,发生了几件事......
您需要将文本设置为黑色,将图像的其余部分设置为白色(not相反)。这就是字符识别的功能。灰度is好的,只要背景大部分是全白,文字大部分是全黑即可;文本的边缘可能是灰色的(抗锯齿)并且may帮助识别(但不一定 - 你必须进行实验)
您看到的问题之一是,在图像的某些部分,文本确实很“薄”(阈值处理后字母中出现间隙),而在其他部分,文本确实很“厚”(并且字母开始合并)。 Tesseract 不会这样:) 发生这种情况是因为输入图像的光照不均匀,因此单个阈值并不适用于所有地方。解决方案是进行“局部自适应阈值处理”,其中为图像的每个邻域计算不同的阈值。有很多方法可以做到这一点,但请查看例如:
-
OpenCV 中的自适应高斯阈值 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html with
cv2.adaptiveThreshold(...,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,...)
- 当地大津的方法 http://sharky93.github.io/docs/dev/auto_examples/plot_local_otsu.html
- 局部自适应直方图均衡 http://sharky93.github.io/docs/dev/auto_examples/plot_local_equalize.html
您遇到的另一个问题是线条不直。根据我的经验,Tesseract 可以处理非常有限非直线的程度(百分之几的透视变形、倾斜或歪斜),但它实际上并不能与wavy线。如果可以的话,请确保源图像具有直线:) 不幸的是,对此没有简单的现成答案;你必须研究研究文献并自己实现一种最先进的算法(如果可能的话将其开源 - 确实需要一个开源解决方案)。谷歌学术搜索“" 将帮助您开始,例如:
- 弯曲文档图像的文本行分割 http://www.academia.edu/7675762/S_Text_line_Segmentation_of_Curved_Document_Images
最后:我认为使用 python 生态系统(ndimage、skimage)会比使用 C++ 中的 OpenCV 做得更好。 OpenCV python 包装器对于简单的东西来说是可以的,但是对于你想要做的事情,它们无法完成工作,你将需要获取许多 OpenCV 中没有的部分(当然你可以混合和匹配)。在 C++ 中实现曲线检测之类的功能将比在 python 中长一个数量级(*即使您不了解 python,也是如此)。
祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)