【人民币识别】基于matlab GUI人民币序列号识别【含Matlab源码 908期】

举报
海神之光 发表于 2022/05/29 22:38:53 2022/05/29
【摘要】 一、简介 本文描述的人民币序列号识别系统实现了从图像预处理到识别结果的过程, 而序列号识别是本文的重要内容.以序列号区域为研究对象, 主要包括图像预处理、图像分割以及序列号识别等过程。 1 图像预处理...

一、简介

本文描述的人民币序列号识别系统实现了从图像预处理到识别结果的过程, 而序列号识别是本文的重要内容.以序列号区域为研究对象, 主要包括图像预处理、图像分割以及序列号识别等过程。

1 图像预处理
人民币图像总体上来说灰度偏高, 灰度值基本上都大于150 (对8位256灰度级而言) , 所以为了突出特征模块 (人民币序列号部分) , 处理时常常采用规定化处理, 首先判断整幅图像的灰度分布情况 (偏白或偏暗) , 然后将所需图像的灰度直方图进行变换.

本系统以较复杂的人民币纸币序列号识别功能实现过程为研究模型, 以人民币正面正向左下角双色异形横号码区作为特征模块来介绍后续的图像处理与识别处理过程.首先识别出纸币的正面正向 (由磁性传感器检测信号识别) , 然后将左下角包含序列号的一个大体区域P0提取出来, 以后的图像处理工作就以P0为对象, 从而减少了所需处理的数据量.
图1 获取的灰度图像
图2 序列号特征区域
然后利用图像增强技术处理序列号区域P0, 由于其较小, 像素数量不多, 可采用空间域图像增强的方法, 主要在以下两方面对P0进行增强处理:一是采用灰度修正的方法突出图像中的序列号部分, 二是去除图像中边缘部分的噪声和内部的孤立点噪声, 以达到增强的目的.

步骤1序列号模块的灰度修正

针对流通人民币新旧程度的差异, 首先对P0进行灰度统计, 然后根据总体灰度的不同来设置不同的灰度变换域值, 从而通过灰度修正达到对P0部分进行增强的目的.

步骤2序列号模块的噪声去除

因为噪声一般频率都比较高, 在频率域内用低通滤波器进行图像平滑, 空域滤波是通过模板运算进行的.线性平滑滤波器对去除高斯噪声有很好的效果, 且在大多数情况下, 对其它类型的噪声也有很好的效果, 但由于均值滤波中要求取各像素灰度的平均值, 因此滤波后会使图像中的尖锐处、边缘处、不连续的点和细节部分变得模糊, 造成了图像信息的丢失.

在图像不连续的边缘部分, 图像存在灰度值的跳跃与突变, 本文采用改进的均值滤波的思想是:通过微分算子求出图像的不连续点, 在滤波后, 把这些点的灰度值恢复到平滑滤波前, 其它部分平滑滤波处理后的值不改变, 也就是只平滑图像非边缘部分, 边缘部分像素灰度值保持不变.改进后的均值滤波算法如下:
(1) 先对原图进行局部均值滤波, 得到原图均值滤波图像.
(2) 对原图进行锐化处理.木文选用拉普拉斯模板对图像进行锐化, 求取原图较细的边缘.
(3) 对锐化图像进行简单的二值化, 得到边缘二值图像.采用比较类别方差法选取阈值.
(4) 去除边缘二值化图像的孤立点.
孤立点:在M×N的模板内 (M、N分别为模板的长和宽) , 如果其内含的位置居中的 (M-1) × (N-1) 子模板内存在像素点, 且此子模板外、M×N模板内没有像素点, 即认为此子模板内的点为孤立点.
(5) 利用去除孤立点后的边缘二值化图像信息, 把在第 (1) 步中均值滤波后图像的边缘点的灰度值恢复到滤波前.
在对灰度修正后的噪声图像去除噪声之前, 应对其进行二值化变换, 其中二值化的域值应根据步骤 (1) 中统计的P0灰度作相应改变.
经过灰度修正与去噪后的效果图如图3、图4所示.
图3 灰度修正效果图
图4 去噪后的二值化图像
在这里插入图片描述

2 图像分割
图像分割的目的是把图像空间分成一些有意义的区域, 最常用的分割方法是把图像灰度分成不同的等级, 然后用设置灰度门限的方法确定有意义的区域或欲分割的物体之边界.其中, 一种最简单实用的方法是对灰度修正后的图像进行二值化变换, 突出所关心的区域, 即进行如下变换:
其中, f (x, y) 为变换前图像, f1 (x, y) 为变换后图像, T为所选取的域值.在此, 图像分割的目的是获得一个个的字符模块, 作为后续的识别对象.其分割步骤如下:

  1. 将包含序列号的区域 (即上述提取的特征模块) 进行二值化处理, 突出字符序列;
  2. 对二值化后的图像进行去噪处理, 包括边缘噪声和内部非字符点噪声;
  3. 字符分割:搜索字符序列右上角起点, 然后根据所规定的数字模块和字母模块的大小, 得到字符相对起点的偏移量, 从而提取出最右边的一个字符;
  4. 针对上一步所提取的最右边第一个字符后的图像, 循环执行3) , 直到所有字符分割完毕, 处理过程如图5所示.
    在这里插入图片描述
    图5 序列号字符分割过程
    3 序列号的SVM识别过程
    将次序最小优化算法构建的支持向量机用于序列号识别的步骤如下:
  5. 给定满足超立方体约束和超线性约束的拉格朗日乘子初始值, 一般取αi=0.
  6. 从第一个训练样本开始.
  7. 计算训练样本的KKT条件, 找到违反KKT条件的样本点对应的拉格朗日乘子, 将其作为两个拟优化的拉格朗日乘子之一.
  8. 第二个拉格朗日乘子的挑选根据最大优化步数来定, 即在原样本集中满足max f (x1) -f (x2) +y1-y2的样本点对应的拉格朗日乘子.至此, 拉格朗日乘子α1、α2挑选完毕, 在保持其余拉格朗日乘子不变的情况下, 形成一个最小规模的二次规划问题 (只含两个拉格朗日乘子) , 求解上述二次优化问题, 得到一对新的α1new、α2new.
  9. 最后一个样本计算结束, 进行下一步;否则, 返回3) , 计算下一个样本.
  10. 将0<α<C所对应的样本构成一个新的样本集, 遍历这个新的训练样本集, 不存在违反KKT条件的样本, 则得到整个问题的最优解, 进行下一步;否则, 针对新的样本集进行优化计算, 转2) .
  11. 得最优分类规则函数.
    次序最小优化算法实现简单、收敛速度快、内存需求小, 是目前最好的支持向量机训练算法之一.

二、部分源代码

function varargout = untitled1(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @untitled1_OpeningFcn, ...
                   'gui_OutputFcn',  @untitled1_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function untitled1_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

guidata(hObject, handles);


function varargout = untitled1_OutputFcn(hObject, eventdata, handles) 

varargout{1} = handles.output;



function pushbutton1_Callback(hObject, eventdata, handles)



function edit1_Callback(hObject, eventdata, handles)

function edit1_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit2_Callback(hObject, eventdata, handles)

function edit2_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function pushbutton2_Callback(hObject, eventdata, handles)


function pushbutton3_Callback(hObject, eventdata, handles)

axis off  %%关闭坐标轴显示
 [filename, pathname] =uigetfile({'*.jpg'; '*.bmp'; '*.gif'; '*.png'}, '选择图片');
% % 没有图像内容
 if filename ==0
     return;
 end
im1 = imread ([pathname, filename]);
imwrite(im1,'C:\Users\lenovo\Desktop\www.dssz.com_ba30784c0af0816644cbf1722cf2\Matlab练习\0.jpg');

axes(handles.axes4); 
imshow(im1); 

  


function pushbutton4_Callback(hObject, eventdata, handles)



function uibuttongroup1_SizeChangedFcn(hObject, eventdata, handles)


function pushbutton5_Callback(hObject, eventdata, handles)


function pushbutton6_Callback(hObject, eventdata, handles)  %向左旋转90度

A1=imread('C:\Users\lenovo\Desktop\www.dssz.com_ba30784c0af0816644cbf1722cf2\Matlab练习\0.jpg');
J1=imrotate(A1,90,'bicubic','loose');   %设置旋转角度,实现向左(逆时针)旋转
imwrite(J1,'C:\Users\lenovo\Desktop\www.dssz.com_ba30784c0af0816644cbf1722cf2\Matlab练习\0.jpg');
axes(handles.axes4); 
imshow(J1); 

function pushbutton7_Callback(hObject, eventdata, handles)


function pushbutton8_Callback(hObject, eventdata, handles)


function uibuttongroup1_SelectionChangedFcn(hObject, eventdata, handles)


function pushbutton9_Callback(hObject, eventdata, handles) %向右旋转

A2=imread('C:\Users\lenovo\Desktop\www.dssz.com_ba30784c0af0816644cbf1722cf2\Matlab练习\0.jpg');
J2=imrotate(A2,-90,'bicubic','loose');   %设置旋转角度,实现向左(逆时针)旋转
imwrite(J2,'C:\Users\lenovo\Desktop\www.dssz.com_ba30784c0af0816644cbf1722cf2\Matlab练习\0.jpg');
axes(handles.axes4); 
imshow(J2); 
function OCR1()

warning off %#ok<WNOFF>
addpath('C:\Users\lenovo\Desktop\www.dssz.com_ba30784c0af0816644cbf1722cf2\Matlab练习\')

if(exist('text1.txt','file')==2)
               delete('text1.txt')
end

    imagen=imread('C:\Users\lenovo\Desktop\www.dssz.com_ba30784c0af0816644cbf1722cf2\Matlab练习\1.jpg');
    
     imshow(imagen);
     title('INPUT IMAGE WITH NOISE');
     pause(0.5);

    if size(imagen,3)==3 %RGB image
        imagen=rgb2gray(imagen);
    end
    
     threshold = graythresh(imagen);
     imagen =~im2bw(imagen,threshold);
    
    imagen = bwareaopen(imagen,30);
    
    word=[ ];
    re=imagen;
    
    fid = fopen('text1.txt', 'a');
   
    load templates
    global templates
   
    num_letras=size(templates,2);
    while 1
        
        [fl re]=lines(re);
        imgn=fl;
        
        [L Ne] = bwlabel(imgn);    
        for n=1:Ne
            [r,c] = find(L==n);
           
            n1=imgn(min(r):max(r),min(c):max(c));  
            
            img_r=imresize(n1,[42 24]);
            
            letter=read_letter(img_r,num_letras);
            
            word=[word letter];
        end
       
        fprintf(fid,'%s\n',word);
        
        word=[ ];
       
        if isempty(re) 
            break
        end    
    end
    fclose(fid);
    copyfile text1.txt 'C:\Users\lenovo\Desktop\www.dssz.com_ba30784c0af0816644cbf1722cf2\Matlab练习\';
    
    winopen('text1.txt');
    



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]李文宏,田文娟,王霞,骆科学.基于支持向量机的人民币纸币序列号识别方法[J].信息与控制. 2010,39(04)

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/117154103

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。