人民币面额自动识别
- 自动缴费机、存取款一体机和自动售货机出现在了我们的生活中。这些先进的设备中最重要的一门技术就是:纸币识别技术。当我们将钞票投入缴费机或者存款机时,机器必定会首先识别用户投入的是面额为多少的纸币,之后再进行真伪辨别、数据写入等功能。目前已经有很多的识别技术诸如图像匹配法识别,神经网络识别、尺寸识别、纸币内部荧光物质识别等等。本小组使用 matlab 软件,
利用软件对图像处理的能力,在保证识别准确率的前提下对 100 元、
50 元和 20 元的人民币进行了识别。
-
- 纸币识别流程图
单击图标添加图片
提取中央数字部分
得出结果
中央数字部分识别
流程各部分详细说明
- 、读入待检测图片
读入一张 100 元人民币图片。
- 、图像边缘检测提取
边缘检测共有两种方法,一种是使用 edge 函数进行边缘检测;另一种是二值化
+ 图像填充 + 提取边缘的方法。
使用 edge 函数进行边缘检测,选择 Sobel 算子。如图, sobel 算子边缘检测后的图像
但是由于内部白色纹路较多, 为了不影响边缘截取,故选择第二种方法:二值化 + 图像填充
+ 提取边缘。
首先对图像进行二值化处理, 然 后 使 用 imfill 函 数 , 调用“ hole” 格式,对图像中的空 洞 进 行 填 充 。 然 后 调 用bwperim 函数, 对二值图像进行边缘检测。右图是检测的过程和结果。
- 、边缘剪切
得到了二值化的边缘图像后,需要对边缘进行剪切,以切掉背景图案, 只留下钞票图案,便于按比例分割图片。
我们采用 mode 函数,对边缘位置确定。首先,将二值图读入矩阵,生成m 行n 列的矩阵。然后一行一行进行检测,遇到白色的区域(值为1 )时,就将白色区域所处的列位置记入数组。当检测完毕后,使用
mode 函数对数组进行检测,数组中数字出现的最多的即是边缘的位置。
-
- 提取中央数字部分
FFv2=jianqie(0.275*m:0.50*m,0.254*n:0.5* n)
- 、中央部分识别
1. 区分百元和 50 、 20 元; 2. 区分 50 元和 20 元
•如图所示5 和2 的细节图。取5 和2 的靠左的一小部分进行
比较(红框圈的),数字5 后两根蓝线之间的距离小于上
面两根蓝线的距离,而2 恰恰相反。于是可以得出结果。
程序运行结果
遇到的问题:
关于背景复杂度的问题
( 1 )过于复杂的背景无法正常识别
因为背景如果过于复杂,二值化后会导致很多复杂的背景变成连续的线条。当这些线条比较 长的时候,边缘检测程序就会将这段线条识别为 边缘,因为众数计算的时候这个位置同样满足。 所以系统会认为此处就是边缘,但事实上只是背 景中的一些二值化的线条。故而导致剪切边缘无 法正确实现,进而影响到后面的中央分割和识别。
( 2 )浅色背景无法正常识别
本程序的边缘检测方法是图像二值化后利用背景和纸币之间的黑白差异来寻找纸币的边缘。当人民币的背景为浅色时, 二值化的时候会将浅色自动二值化为白色
( 1 ),而纸币内部只有少部分会二值化
为黑色,但边缘周围仍为白色,这样一来根本无法区分纸币和背景,所以用 imfill 填充后无法清除地看到二值图的边缘