opencv4android开发记录(2):简单文字检测

来源:互联网 发布:淘宝开发者平台 api 编辑:程序博客网 时间:2024/06/07 10:28

       本文将和大家分享一种简单的文字检测算法,算法不复杂,所以就不是万能的,不能检测某些情况下的文字,至于为什么,读到下面自然知道。由于本文主要分享的是思路,具体的实现方法不做过多解释,如果文中提到的一些图像处理方法不懂的话自行学习,网上有很多解答,我这里未必能讲清楚,所以希望自行学习。本文最后会提供免费源码下载,供大家学习讨论,同时代码不一定完善,大家发现的话,希望提出宝贵意见,如有问题可留言讨论。

       (一) 检测思路

         本文方法主要针对网页截图或类似的图片文字提取。这类图片中的文字主要有两个特点:边缘信息较多和文字区域高度在一定范围(往往该范围之外的边缘信息较多的区域为图片)。本文方法主要通过这两个特点实现文字提取。思路大概是将边缘信息体现到像素值上,对像素值统计确定可能的文字区域,然后将图片区域剔除,剩下的区域就是文字区域了。 

       (二)方法步骤

       1、边缘信息体现到像素上

       提到边缘信息,自然就想到边缘提取算法,相信很多人都知道很多种方法了,这里就不多做解释。关键提取完边缘该怎么做才能用像素值体现出边缘信息呢?这里提供一种方法,先二值化边缘提取的图像,再通过膨胀腐蚀来完成。如果不清楚图像的膨胀腐蚀,请自行学习,此处不作讲解。之后得到一幅可以用非零像素体现边缘信息的图像。其实边缘提取之后的图像也可以体现,但是查看边缘提取的图片,很容易发现文字区域的非零像素值比较少,文字与文字之间分开,不利于后续处理,所以需要膨胀腐蚀。 

       2、提取可能的文字区域

      上面得到的图像中,文字区域呈现出大量非零像素,而文字区域一般是矩形,我们需要确定矩形的上下左右边界就能确定一个可能的文字区域了。对某一行的非零像素值统计,如果大于一个阈值就认为有文字,因为文字有丰富的边缘信息,步骤1将这一信息体现在非零像素值,所以此处统计非零像素值,这样就可以确定文字区域的上下边界。同理,在得出一个上下边界的区域之后,对该区域的纵向统计非零像素,得左右边界。用此方法就可以提取提取整个图像中文字的可能区域。注意,这里查找可能的区域是横向和纵向,如果文字是斜的,那么查找的区域与真实区域存在误差,后面去除图片区域的时候就有可能去掉这个区域,所以这个文字提取方法不能提取斜着的文字。

      3、去除图片区域

       通过以上介绍,可以知道去除图片区域是根据文字的高和宽在一定范围内实现。因此对上一步得到的所有区域计算其高度和,如果过大或过小就丢掉该区域,文字宽度可以占据整幅图片。所以此处一般不对文字区域宽度做最大限定,只是限定其最小值。

       好了,大概就这些了。总结一下,首先图像提取轮廓,膨胀腐蚀,然后通过统计非零像素得到可能的文字区域,再根据文字宽和高的限制筛选,剔除图像区域。看一下结果:


       这里再说一下,对大图像运算时,如果直接在UI线程运行的话界面会卡死,很不爽,因此我将运算部分放到async task里执行(不懂的同学可以自行学习),然后加了一个进度条显示进度,并且图像的高度和宽度可以输入,界面丑了点,但是学习文字提取的方法是可以用了的。最后说一下自己学习该方法是在百度文库中的一篇文章中学到的,百度matlab检测文字应该可以找到,此处通过学习他的matlab,了解核心方法,用opencv4android实现。当然,还有很多种文字检测的方法,后续有时间会陆续更新,之后也会记录一些文字识别和人脸检测和识别等方法,希望感兴趣的同学可以一起学习交流,如有大牛能对本文方法存在的错误进行指正,我将感激不尽。

       附上相关程序下载地址:https://github.com/kmin0579/CharDetect.git

原创粉丝点击