当前位置: 首页 > news >正文

基于MATLAB的身份证号码识别系统

  • 课题介绍

本课题为基于连通域分割和模板匹配的二代居民身份证号码识别系统,带有一个GUI人机交互界面。可以识别数十张身份证图片。

首先从身份证图像上获取0~9和X共十一个号码字符的样本图像作为后续识别的字符库样本,其次将待测身份证图像进行去噪、灰度化、二值化、水平投影切割,垂直投影并切割,将待测身份证号码分割出来,然后进行待测号码图片与字符库样本对比计算、识别判断、最终确定待测身份证号号码。本设计关于身份证号码的识别是基于Matlab软件的基础上进行的。

  • 算法流程
  1. 输入身份证图片;2、根据几何信息定位身份证号码位置并且切割;3、利用连通域算法切割字符;4、利用模板匹配算法进行识别

  • GUI界面设计

四、运行预期ps图

五、源码

1、打开图像

[FileName,PathName] = uigetfile('*.jpg','Select an image');

if PathName~=0

    str = [PathName,FileName];

    T=imread(str);

    axes(handles.axes1);

    imshow(T);

end

  1. 预处理

[m,n,r]=size(I);%图像的像素为width*height

%%%%%蓝色字体变黑

myI=double(I);

for i=1:m

    for j=1:n

            if((myI(i,j,1)>=15)&&(myI(i,j,1)<=130)&&((myI(i,j,2)<=165)&&(myI(i,j,2)>=90))&&((myI(i,j,3)<=220)&&(myI(i,j,3)>=135))) % 蓝色RGB的灰度范围

              I(i,j,1)=40; %红色分量

              I(i,j,2)=40; %绿色分量

                         end  

    end       

end

%figure, imshow(I);title('变色后的图像');

width=round(0.9*n);height=round(0.87*m);

rx=round(0.05*n);cy=round(0.075*m);

I=subim(I,height,width,rx,cy);

%figure,imshow(I);

if sum(size(I)>0)==3 %倘若是彩色图--2维*3,先转换成灰度图

I=rgb2gray(I);

end

%figure,imhist(I);

x=3;%行数分为x部分

y=1;%列数分为y部分

BW=erzhihua(I,x,y);

BW=imadjust(BW);%使用imadjust函数对图像进行增强对比度

% Convert to BW

threshold = graythresh(BW);

BW =~im2bw(BW,0.6*threshold);

[image_h image_w]=size(BW);

% Remove all object containing fewer than (imagen/80) pixels

BW = bwareaopen(BW,floor(image_w/80));

% 滤波

imshow(BW);

  1. 识别

[image_h image_w]=size(imagen);

%figure;imshow(imagen);title('INPUT IMAGE')

% Convert to gray scale

if size(imagen,3)==3 %RGB image

    imagen=rgb2gray(imagen);

end

%Storage matrix word from image

word=[ ];

re=imagen;

% Compute the number of letters in template file

num_letras=size(templates,2);

plot_flag=1;

while 1

    %Fcn 'lines' separate lines in text

    [fl re]=lines(re);

    imgn=fl;

    [line_h line_w]=size(fl);%记录下切割出来的一行字符的长宽

    %Uncomment line below to see lines one by one

    % imshow(fl);pause(1)    

    %-----------------------------------------------------------------     

    % Label and count connected components

   [L Ne] = bwlabel(imgn);    

      n=1;%记录循环次数

while(n<=Ne)

        char_flag=0;%为0时,是第一次判断这个连通域

        flag=1;%初始化两个连通域属于同个字符

   while(flag==1)       

      if char_flag==0

        [r,c] = find(L==n);

        Width0=max(r)-min(r);%连通域宽度

        Height0=max(c)-min(c);%连通域高度

        Radio0=Width0/Height0;%连通域宽高比

                maxr=max(r);

        maxc=max(c);

        minr=min(r);

        minc=min(c);

      end

       if n<Ne

          [r1,c1] = find(L==(n+1));%寻找下一个连通域

          Width1=max(r)-min(r);%连通域宽度

          Height1=max(c)-min(c);%连通域高度

          Radio1=Width1/Height1;%连通域宽高比

          Square1=Width1*Height1;%连通域面积

          Uheight=max(maxc,max(c1))-min(minc,min(c1));%合并后高度

          Uwidth=max(maxr,max(r1))-min(minr,min(r1));%合并后宽度

          Uradio=Uwidth/Uheight;%合并后的宽高比

          Oheigth=Height0+Height1-Uheight;%重叠高度

          Owidth=Width0+Width1-Uwidth;%重叠宽度

          Osquare=Oheigth*Owidth;%重叠面积

       else

           flag=0;%这是这一行最后一个连通域

       end

           ph=5;%边界因子

           pw=7;

       if(flag==1)&&((Owidth>=-(image_w/pw)&&Owidth<=0)||(Oheigth>=-(line_h*0.3)&&Oheigth<=0))%两个连通域较近,但不重叠

           if((Uradio>=0.8)&&(Uradio<=1.2))%认为两个连通域属于同一个字符

           elseif Uheight<line_h*0.4;%连通域的合并之后高度过小的,认为是一个字符的一部分,很可能是边旁部首

           else flag=0;%否则这两个连通域属于不同字符  

           end       

      elseif(flag==1)&&((Owidth>0))%两连通域重叠

               if(((Uradio>=0.78)&&(Uradio<=1.3)))%认为两个连通域属于同一个字符

               elseif(Osquare>=0.4*min(Square0,Square1)&&(Uwidth<image_w/45))

               else

               flag=0;%两个连通域属于不同字符

           end

       else flag=0;%两个连通域属于不同字符

       end

       if flag==1%经过上面判断,两个连通域属于同一个字符,进行连通域合并

           Width0=Uwidth;%连通域宽度

           Height0=Uheight;%连通域高度

           Radio0=Width0/Height0;%连通域宽高比

           Square0=Width0*Height0;%连通域面积

           maxr=max(maxr,max(r1));

           maxc=max(maxc,max(c1));

           minr=min(minr,min(r1));

           minc=min(minc,min(c1));

           n=n+1;%指向下一个连通域

           char_flag=1;

       end

   end  %while(flag==1)的end

           

        

        

        % Extract letter

        n1=imgn(minr:maxr,minc:maxc);  

        % Resize letter (same size of template)

        img_r=imresize(n1,[36 23]);

               plot_flag=plot_flag+1;

        %Uncomment line below to see letters one by one

        % imshow(img_r);title(n);pause(0.5)

        %-------------------------------------------------------------------

        % Call fcn to convert image to text

        letter=read_letter(img_r,num_letras);

        % Letter concatenation

        word=[word letter];

        n=n+1;

        end % while(n<=Ne)的end

    %fprintf(fid,'%s\n',lower(word));%Write 'word' in text file (lower)

    set(handles.edit1,'string',word);

   

    word=[ ];

    

相关文章:

基于MATLAB的身份证号码识别系统

课题介绍 本课题为基于连通域分割和模板匹配的二代居民身份证号码识别系统&#xff0c;带有一个GUI人机交互界面。可以识别数十张身份证图片。 首先从身份证图像上获取0&#xff5e;9和X共十一个号码字符的样本图像作为后续识别的字符库样本&#xff0c;其次将待测身份证图像…...

【人工智能-初级】练习题:matplotlib基础练习30例

练习 1: 画折线图 import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [10, 20, 25, 30, 40] 使用 plt.plot() 画出折线图,适用于连续数据的可视化 plt.plot(x, y) plt.xlabel(‘X 轴’) plt.ylabel(‘Y 轴’) plt.title(‘简单折线图’) plt.show() 练习 2: 画散…...

【002】基于SpringBoot+thymeleaf实现的蓝天幼儿园管理系统

基于SpringBootthymeleaf实现的蓝天幼儿园管理系统 文章目录 系统说明技术选型成果展示账号地址及其他说明源码获取 系统说明 基于SpringBootthymeleaf实现的蓝天幼儿园管理系统是为幼儿园提供的一套管理平台&#xff0c;可以提高幼儿园信息管理的准确性&#xff0c;系统将信息…...

nvm详解

本文借鉴转载于 nvm文档手册 文章目录 1.nvm是什么&#xff1f;2.nvm安装2.1 window上安装下载链接安装步骤 2.2 Mac上安装使用homebrew 安装 nvm 3.nvm使用指令 1.nvm是什么&#xff1f; nvm&#xff08;Node Version Manager&#xff09;是一个用于管理和切换不同版本 Node.…...

Lucene的概述与应用场景(1)

文章目录 第1章 Lucene概述1.1 搜索的实现方案1.1.1 传统实现方案1.1.2 Lucene实现方案 1.2 数据查询方法1.1.1 顺序扫描法1.1.2 倒排索引法 1.3 Lucene相关概念1.3.1 文档对象1.3.2 域对象1&#xff09;分词2&#xff09;索引3&#xff09;存储 1.3.3 常用的Field种类 1.4 分词…...

11.3笔记

在C#中&#xff0c;静态类和普通类&#xff08;实例类&#xff09;有一些关键的区别&#xff1a; 实例化&#xff1a; 普通类&#xff1a;可以被实例化&#xff0c;即创建对象。每个对象都有自己的状态和方法。静态类&#xff1a;不能被实例化&#xff0c;它们不包含构造函数&a…...

数据结构之线段树

线段树 线段树&#xff08;Segment Tree&#xff09;是一种高效的数据结构&#xff0c;广泛应用于计算机科学和算法中&#xff0c;特别是在处理区间查询和更新问题时表现出色。以下是对线段树的详细解释&#xff1a; 一、基本概念 线段树是一种二叉搜索树&#xff0c;是算法竞…...

vue 快速入门

文章目录 一、插值表达式 {{}}二、Vue 指令2.1 v-text 和 v-html&#xff1a;2.2 v-if 和 v-show&#xff1a;2.3 v-on&#xff1a;2.4 v-bind 和 v-model&#xff1a;2.5 v-for&#xff1a; 三、生命周期四、Vue 组件库 Element五、Vue 路由 本文章适用于后端人员&#xff0c;…...

iframe视频宽度高度自适应( pc+移动都可以用,jq写法 )

注意&#xff1a;要引入jquery 可以直接使用弹框播放iframe 一、创建 index.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.modal {/* 默认隐藏 */display: none;position: fixed;z-i…...

Observability:OpenTelemetry Elastic 分发简介

作者&#xff1a;来自 Elastic Alexander Wert•Miguel Luna•Bahubali Shetti Elastic 自豪地推出了 Elastic Distributions of OpenTelemetry (EDOT)&#xff0c;其中包含 Elastic 版本的 OpenTelemetry Collector 和多种语言 SDK&#xff0c;如 Python、Java、.NET 和 NodeJ…...

golang的RSA加密解密

参考&#xff1a;https://blog.csdn.net/lady_killer9/article/details/118026802 1.加密解密工具类PasswordUtil.go package utilimport ("crypto/rand""crypto/rsa""crypto/x509""encoding/pem""fmt""log"&qu…...

深度学习-梯度消失/爆炸产生的原因、解决方法

在深度学习模型中&#xff0c;梯度消失和梯度爆炸现象是限制深层神经网络有效训练的主要问题之一&#xff0c;这两个现象从本质上来说是由链式求导过程中梯度的缩小或增大引起的。特别是在深层网络中&#xff0c;若初始梯度在反向传播过程中逐层被放大或缩小&#xff0c;最后导…...

MVC(Model-View-Controller)模式概述

MVC&#xff08;Model-View-Controller&#xff09;是一种设计模式&#xff0c;最初由 Trygve Reenskaug 在 1970 年代提出&#xff0c;并在 Smalltalk 编程环境中得到了广泛应用。MVC 模式旨在实现用户界面和业务逻辑的分离&#xff0c;以增强应用程序的可维护性、可扩展性和复…...

数据结构 —— 红黑树

目录 1. 初识红黑树 1.1 红黑树的概念 1.2 红⿊树的规则 1.3 红黑树如何确保最长路径不超过最短路径的2倍 1.4 红黑树的效率:O(logN) 2. 红黑树的实现 2.1 红黑树的基础结构框架 2.2 红黑树的插⼊ 2.2.1 情况1&#xff1a;变色 2.2.2 情况2&#xff1a;单旋变色 2.2…...

《功能高分子学报》

《功能高分子学报》 中国标准连续出版物号:CN 31-1633/O6&#xff0c;国际标准连续出版物号&#xff1a;ISSN 1008-9357&#xff0c;邮发代号&#xff1a;4-629&#xff0c;刊期&#xff1a;双月刊。 《功能高分子学报》主要刊登功能高分子和其他高分子领域具有创新意义的学术…...

Linux特种文件系统--tmpfs文件系统

tmpfs类似于RamDisk&#xff08;只能使用物理内存&#xff09;&#xff0c;使用虚拟内存&#xff08;简称VM&#xff09;子系统的页面存储文件。tmpfs完全依赖VM&#xff0c;遵循子系统的整体调度策略。说白了tmpfs跟普通进程差不多&#xff0c;使用的都是某种形式的虚拟内存&a…...

《基于STMF103的FreeRTOS内核移植》

目录 1.FreeRTOS资料下载与出处 1.1官网下载&#xff0c;网址&#xff1a;www.freertos.org 1.2在正点原子官网&#xff0c;任意STM32F1的开发板资料A盘里&#xff0c; 2.FreeRTOS移植重要文件讲解 2.1 FreeRTOS与FreeRTOS-Plus文件夹 2.2 Demo、Lincence、Source ●Demo文件…...

一七二、Vue3性能优化方式

Vue 3 的性能优化相较于 Vue 2 有了显著提升&#xff0c;利用新特性和改进方法可以更高效地构建和优化应用。以下是 Vue 3 的常见性能优化方法及示例。 1. 使用组合式 API (Composition API) Vue 3 引入的组合式 API&#xff0c;通过逻辑拆分和复用来实现更高效的代码组织和性…...

软件测试--BUG篇

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1. 软件测试的⽣命周期 2. BUG 1. BUG 的概念 2. 描述bug的要素 3.bug级别 4.bug的⽣命周期 5 与开发产⽣争执怎…...

Scikit-learn和Keras简介

一&#xff0c;Scikit-learn是一个开源的机器学习库&#xff0c;用于Python编程语言。它建立在NumPy、SciPy和matplotlib这些科学计算库之上&#xff0c;提供了简单有效的数据挖掘和数据分析工具。Scikit-learn库包含了许多用于分类、回归、聚类和降维的算法&#xff0c;包括支…...

python在word的页脚插入页码

1、插入简易页码 import win32com.client as win32 from win32com.client import constants import osdoc_app win32.gencache.EnsureDispatch(Word.Application)#打开word应用程序 doc_app.Visible Truedoc doc_app.Documents.Add() footer doc.Sections(1).Footers(cons…...

Java面试题十四

一、Java中的JNI&#xff08;Java Native Interface&#xff09;是什么&#xff1f;它有什么用途&#xff1f; Java中的JNI&#xff08;Java Native Interface&#xff09;是Java提供的一种编程框架&#xff0c;它允许Java代码与本地&#xff08;Native&#xff09;代码&#x…...

yarn : 无法加载文件,未对文件 进行数字签名。无法在当前系统上运行该脚本。

执行这个命令时报错&#xff1a;yarn --registryhttps://registry.npm.taobao.org yarn : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1。未对文件 C:\Users\Administ rator\AppData\Roaming\npm\yarn.ps1 进行数字签名。无法在当前系统上运行该脚本。有…...

Hadoop——HDFS

什么是HDFS HDFS&#xff08;Hadoop Distributed File System&#xff09;是Apache Hadoop的核心组件之一&#xff0c;是一个分布式文件系统&#xff0c;专门设计用于在大规模集群上存储和管理海量数据。它的设计目标是提供高吞吐量的数据访问和容错能力&#xff0c;以支持大数…...

计算机的一些基础知识

文章目录 编程语言 程序 所谓程序&#xff0c;就是 一组指令 以及 这组指令要处理的数据。狭义上来说&#xff0c;程序对我们来说&#xff0c;通常表现为一组文件。 程序 指令 指令要处理的数据。 编程语言发展 机器语言&#xff1a;0、1 二进制构成汇编语言&#xff1a;…...

学习RocketMQ(记录了个人艰难学习RocketMQ的笔记)

一、部署单点RocketMQ Docker 部署 RocketMQ (图文并茂超详细)_docker 部署rocketmq-CSDN博客 这个博主讲的很好&#xff0c;可食用&#xff0c;替大家实践了一遍 二、原理篇 为什么使用RocketMQ&#xff1a; 为什么选择RocketMQ | RocketMQ 关于一些原理&#xff0c;感觉…...

【设计模式】策略模式定义及其实现代码示例

文章目录 一、策略模式1.1 策略模式的定义1.2 策略模式的参与者1.3 策略模式的优点1.4 策略模式的缺点1.5 策略模式的使用场景 二、策略模式简单实现2.1 案例描述2.2 实现代码 三、策略模式的代码优化3.1 优化思路3.2 抽象策略接口3.3 上下文3.4 具体策略实现类3.5 测试 参考资…...

list与iterator的之间的区别,如何用斐波那契数列探索yield

问题 list与iterator的之间的区别是什么&#xff1f;如何用斐波那契数列探索yield&#xff1f; 2 方法 将数据转换成list,通过对list索引和切片操作&#xff0c;以及可以进行添加、删除和修改元素。 iterator是一种对象&#xff0c;用于遍历可迭代对象&#xff08;如列表、元组…...

抖音店铺数据也就是抖店,如何使用小店数据集来挖掘价值?

​ 抖音商家现在基本达到二百多万家抖店&#xff0c;有一些公司可能会根据开放的数据研究行业分布、GMV等等&#xff0c;就像是也出了专业的一些平台如“蝉妈妈”、“达多多”&#xff0c;对我来说受限制就是难受。 当然也有很多大型合法的数据平台有抖店数据集&#xff0c;但…...

KubeVirt 安装和配置 Windows虚拟机

本文将将介绍如何安装 KubeVirt 和使用 KubeVirt 配置 Windows 虚拟机。 前置条件 准备 Ubuntu 操作系统&#xff0c;一定要安装图形化界面。 安装 Docker&#xff08;最新版本&#xff09; 安装 libvirt 和 TigerVNC&#xff1a; apt install libvirt-daemon-system libvir…...