数图大作业我们组选了基于模板匹配的文字识别这个题目。老师提供了多行文字行列分割参考程序(CVI 5.0),我参照了例程的思路,在CVI2012环境下完成了预处理、行列分割以及模板匹配算法设计和代码编程。
题目要求
首先建立一个常用的汉字标准样本图像库:
(1)利用“画图”程序建立200-300个字的汉字图库,将单个汉字的图像保存为 .bmp 文件;
(2)将所有的样本图像均缩放为标准尺寸图像,例如 48 * 64 (width * height)。
(3)将所有的样本图像变为二值图像,构成标准汉字模板库。
利用“画图”程序制作包含多个汉字的测试图像。
编写字符识别程序,采用基于模板匹配的方法完成对汉字的识别:
(1)对测试图像进行二值化;
(2)完成行、列分割;
(3)将单个汉字图像与模板库中的字符图像逐一匹配,完成识别;
对多幅类似图像进行验证试验;
界面友好,操作方便,能单步演示识别过程,也可以“一键运行”,识别速度较快。
注:本次大作业在 CVI2012 环境下完成,利用 IMAQ6.0 库完成图像处理,如果采用其他图像处理库比如 opencv、halcon 等等,可以参考处理思路。
思路
最终效果展示
演示视频
实现要点和预处理分析
1.模板图像和测试图像均由“画图”程序裁剪而成,注意模板图像和测试图像需要缩放至同一尺寸,方便进行匹配,这部分可以用 imaqResample 函数来完成。例如:
将 splitImage 图片缩放成 60 * 60 的大小,并保存至 dstImage 。
为了防止切割到汉字,可以先进行列分割和行分割,再进行缩放。
imaqResample (dstImage, splitImage, 60, 60, IMAQ_ZERO_ORDER, IMAQ_NO_RECT);
2.为了方便后面的行列分割,图像预处理部分需要完成输入的测试图像的二值化和反色,经过二值化后的图像灰度值仅有 0 和 255 ,经过反色处理后白色像素点变成黑色像素点,即灰度值从 255 变成 0。二值化可以用 imaqThreshold 函数完成,反色可以用 imaqNor 函数完成。
二值化和反色处理代码如下:
imaqThreshold(binImage, srcImage, 100, 255, TRUE, 255); // 二值化:灰度值如果超过100,则替换为255,否则为0 imaqNor(binImage, binImage, binImage); // 反色:或非运算,第一个参数是输出图像,后面两个是参与运算的输入图像
除了测试图像需要进行二值化处理,模板图像也要进行二值化处理。
3.行列分割均可以根据像素值来分割,对于白底黑字的图片来说,逐行逐列扫描,检测到黑色像素即可确定存在汉字或标点符号。
但要注意列分割必须对每一行进行,不能进行全局列分割。意思是,先逐行分析,然后行扫描,最后列扫描,而不能直接进行行扫描和列扫描,因为每列文字有可能对不齐。
4.模板匹配除了要完成文字识别,还要完成标点符号以及空格的识别。
5.一键运行功能的实现可以通过在 .uir 文件创建一个按钮,在按钮的回调函数中,调用行列分割以及模板匹配的函数。
GUI界面
功能键包括:
打开一幅图像
行分割
列分割
保存分割图像
匹配输出
一键运行(行分割+列分割+匹配输出)
退出