初探基于Tesseract、图像二分法、阈值实现的图像文字识别

开发环境:Linux乌班图

Tesseract 是一个 OCR 库,目前由 Google 赞助(Google 也是一家以 OCR 和机器学习技术闻名于世的公司)。Tesseract 是目前公认最优秀、最精确的开源 OCR 系统,除了极高的精确度,Tesseract 也具有很高的灵活性。

1、安装

1、sudo apt-get install tesseract-ocr(安装tesseract)

2、pip install pytesseract(python操作pytesseract)



2、识别规范的图片

选取黑白对比度明显的规范图片,如下图



识别结果:

识别结果相对准确,不过符号^*分别被表示成了双引号和单引号。大体上可以让你舒服阅读。


3、二分法、阈值处理识别不规范图片

该图片底有黑白渐变,tesseract识别会出现问题,我用上面同样的方法做尝试,识别率不行


这是我打印的,很明显,右侧干扰越明显,识别率越差


那么我们该怎么做?首先我们要有一些颜色理论基础,一般在屏显颜色模式是RGB(红绿蓝)模式,这些颜色构成了我们日常见到的形形色色的图像,同时这些色彩模式也能合成黑白灰,懂前端的朋友,肯定知道css3中我们设置颜色和不透明度会用到rgba(a,b,c,opacity)这样的参数,黑白灰模式中色值从0--255范围,0代表纯黑,255代表纯白,中间的就是不同程度的灰色,换言之也就是色值从0到255,是从纯黑到纯白的过渡

而我们进行图像二分、阈值的预处理,也是基于该理论,观察我们的图像,我们所要做的就是让白色部分变成纯白,灰色和黑色变成纯黑,这样处理成只有黑白对比明显的图片,就可以通过tessoract进行较好的识别

那么问题来了,我们就是想让图片中灰色部分的色值都变成255,也就是纯白,怎么确定灰色的临界值呢?观察图像,我们看到图像底色的从白到灰的渐变,发现最右侧灰色最深,也就是我们确定了最右侧的灰度色值m,我们通过程序将大于m的色值都变成255,小于m色值的都变成0,怎么测出临界色值m呢?

我之前做设计,后来转行到python,这里我用PS软件拾色器进行获取色值,当然网上也有很多拾色器工具,百度一下一大把,也可以使用,我选取最右侧灰色最深的部分,灰色色值为129,即我们需要的m值



接下来开始用代码实现上述思路,将大于129的统统变成255,小于129的统统变成0,代码如下,发现打印结果仍有一些缺陷,当然细心的朋友发现,我在选取的时候并没有选取到最右上角的最深的灰色,还差一点


我又多测试了一些点,发现最佳值为125左右


重新选取的125的点,识别结果略有改观,并经过多次测试更多125左右的,发现125处识别还是相对较好,符合我们之前的思路


这里我吧中间处理后的图片保存打开,发现处理成这个样子


对比PS中阈值处理的效果,基本比较相似



结束语:

tessoract识别率根据图像处理的效果息息相关,更深入图像处理,希望大家多看下PIL库中的一些方法,本文主要讲的是一个思路,不足之处或者大家有什么更好的建议,欢迎指正