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

news2024/11/15 11:37:40

⛄一、简介

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

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
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 备注**
简介此部分摘自互联网,仅供参考,若侵权,联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

具有平滑正曲线边界的一般凸体的精确闭式闵可夫斯基研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Minecraft 1.19.2 Forge模组开发 04.动画效果物品

我们本次实现一个具有动画效果的物品&#xff0c;本次演示的模型代码均在文末给出 效果演示效果演示效果演示 首先&#xff0c;请确保你的开发包中引入了geckolib依赖&#xff0c;相关教程请参考:Minecraft 1.19.2 Forge模组开发 03.动画生物实体 1.首先我们要使用geckolib制…

(三)操作系统的运行环境

文章目录一、操作系统的运行机制1. 时钟管理2. 中断机制3. 原语4. 系统数据结构5. 系统调用二、操作系统体系结构1. 传统的操作系统结构&#xff08;大内核&#xff09;第一代&#xff1a;无结构OS第二代&#xff1a;模块化结构OS&#xff1a;模块-接口法OS第三代&#xff1a;分…

[附源码]计算机毕业设计springboot学习帮扶网站设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

坦克大战②

1. 我方坦克发射单颗子弹 当发射一颗子弹后&#xff0c;就相当于启动一个线程来控制它的位置坐标&#xff1b;Hero[我方坦克]有子弹的对象&#xff0c;当按下J时&#xff0c;就创建一个发射子弹的线程&#xff0c;通过坐标变化让子弹不停的移动&#xff0c;形成一个射击的效果&…

redis 集群搭建的三种方式

文章目录一、Redis主从二、Redis哨兵三、Redis集群一、Redis主从 二、Redis哨兵 三、Redis集群 下载redis wget http://download.redis.io/releases/redis-5.0.3.tar.gz解压redis tar zxvf redis-5.0.3.tar.gz进行重命名 mv redis-5.0.3 redis安装gcc yum install gcc进入red…

如何学习一门技术

如何学习一门技术 同样的生活&#xff0c;在你经历了一些意外和不如意之后&#xff0c;你再回过头来看&#xff0c;之前你所抱怨的生活其实是一个蛮不错的生活。 罗翔&#xff1a;每一个人都应该拥有学习的能力和权力&#xff0c;真正的知识要能走出书斋&#xff0c;去影响每…

StarkNet 性能路线图

目录 前言 区块限制&#xff1a;Validity Rollups vs L1 为什么 L1 吞吐量有限&#xff1f; 为什么相同的障碍不影响validity rollups&#xff1f; Sequencer 并行化 Cairo-VM 的新 Rust 实现 Rust 对 sequencer重新实现 Provers呢&#xff1f; Summary 参考 前言 St…

详解设计模式:迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09;也被称为游标模式&#xff08;Cursor Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。是一种最简单也最常见的设计模式。 迭代器模式 可以让用户透过特定的接口巡访容器中的每一个元素而不用…

HTML5期末大作业:美食网页主题网站设计与实现——HTML+CSS+JavaScript月饼美食食品企业网站html模板9页面

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

[附源码]计算机毕业设计校园运动会管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Linux基本工具——vim

Linux编辑器vim什么是vimvim的三种常用模式vim的基本操作命令模式插入模式底行模式搭配vim环境sudo怎么才能让普通用户使用什么是vim vim是linux下一款功能强大&#xff0c;多模式的编辑器。 现阶段有13种模式。 这就是进入vim的方式。 vim的三种常用模式 命令模式 我们第一…

CentOS7 编译安装最新的Linux Kernel 6.0 rc3

哪个男孩不想手动编译一份自己的内核呢&#xff1f;安装编译环境 CentOS7安装必要的包 yum groupinstall "Development Tools" -y && yum install openssl-devel -y && yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-…

Java核心技术卷Ⅰ-第四章对象和类

重点 1.使用预定义类 2.方法参数 3.对象构造 4.包 5.类设计技巧 1.使用预定义类 一个源文件只能有一个公共类&#xff0c;可以有任意数目的非公共类可以使用通配符调用Java编译器&#xff1a;javac Test*.java使用var声明局部变量就不用担心0、0L和0.0之间的区别&#xff0c;因…

找出链表中间结点的三种解法

初阶链表刷题注意&#xff01;&#xff01;&#xff01;学习的是解题的思维&#xff01; 找出链表的中间结点&#xff08;链接在末尾&#xff09; 解题思路 数组解法 由于链表不能通过下标访问对应的结点&#xff0c;所以我们将所有的结点存储在数组中&#xff0c;这样就可以通…

测试开发怎么学?

随着互联网行业的高速发展,快速高质量的产品版本迭代成为企业始终立于不败之地的迫切需求,而在短期迭代的快节奏中.传统测试工作面对更大压力,无法持续提供高效率高质量的人力支撑&#xff0c;所以越来越多的企业需要技术更为全面的测试开发工程师。 测试开发本质上属于测试,区…

【数据结构】二叉树链式结构的实现

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 文章目录一、二叉树的链式存储二、二叉树链式结构的实现结构设计手动构建二叉树前序遍历中序遍历…

游戏思考26:游戏服务器压力测试文档(最近在忙这个,这个会更新频繁,12/03未完待续)

文章目录一、压力测试关注点二、计算最耗时的加载操作1&#xff09;从数据库读取数据&#xff0c;对加载的类型进一步划分各种类型&#xff0c;计算最耗时操作2&#xff09;查看CPU随着在线人数的变化所占百分比3&#xff09;查看内存变化4&#xff09;备注一、压力测试关注点 …

【C语言字符串】一道题检验你的字符串学习情况

作者&#xff1a;匿名者Unit 目录 一.字符串引言1.字符串基础二.洛谷P5734详解1.字符串相关库函数&#xff08;1&#xff09; strcpy函数 &#xff08;2&#xff09; strcat函数 &#xff08;3&#xff09;strstr函数 2.题目讲解一.字符串引言 1.字符串基础 字符串通常以\0作为…

008. 子集

1.题目链接&#xff1a; 78. 子集 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给一个元素各不相同的数组 nums&#xff0c;返回各种可能的子集&#xff08;子集不能重复&#xff09; 比如&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[…