本文描述的人民币序列号识别系统实现了从图像预处理到识别结果的过程, 而序列号识别是本文的重要内容.以序列号区域为研究对象, 主要包括图像预处理、图像分割以及序列号识别等过程。
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为所选取的域值.在此, 图像分割的目的是获得一个个的字符模块, 作为后续的识别对象.其分割步骤如下:
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
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');
## ⛄三、运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/e7483155f1cc4b569ceadf0e8ff820c3.JPG?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA57Sr5p6B56We5YWJ,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
## ⛄四、matlab版本及参考文献
**1 matlab版本**
2014a
**2 参考文献**
[1]李文宏,田文娟,王霞,骆科学.基于支持向量机的人民币纸币序列号识别方法[J].信息与控制. 2010,39(04)
**3 备注**
简介此部分摘自互联网,仅供参考,若侵权,联系删除