【身份证识别】身份证号码识别【含GUI Matlab源码 014期】

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式
⛳️座右铭:行百里者,半于九十。

更多Matlab仿真内容点击👇
Matlab图像处理(进阶版)
路径规划(Matlab)
神经网络预测与分类(Matlab)
优化求解(Matlab)
语音处理(Matlab)
信号处理(Matlab)
车间调度(Matlab)

⛄一、身份证号码识别简介

1 引言
作为居民身份的象征,身份证是居民身份的唯一标识,它已成为生活中必不可少的证件。在火车站、酒吧等公共场所,流动人口大人员复杂,警察需要对公民的身份证进行核对,排除可疑人员。为了提高警察的办事效率,提出通过手机终端将居民的身份证号码进行自动识别。
身份证号码的自动识别技术属于图像数字识别领域,目前国内外采用得较多的方法主要有两类:基于模板匹配的 OCR 算法和基于人工神经网络的OCR算法,其中尤以模板匹配法应用最为广泛。模板匹配法主要是通过提取目标的特征(包括灰度特征、形状特征、网格
特征等)与模板库中的模板进行匹配计算它们的相似度或者欧式距离,当满足一定的阈值时就认为目标与该模板一致。模板匹配法通常用于目标特征容易提取且模板库比较小的情形,但模板匹配法容易受噪声干扰而降低识别的准确度,在提取的特征个数较多时匹配所需时间也会延长。

2 基本原理
身份证号码识别技术的基本原理如图 1 所示。首先需要扫描样本图像以获得样本字符的特征以放入特征库中,因为第二代居民身份证号码的字体比较特殊,需要从样本图像中获取数字 0~9及字母 x的特征作为特征库,其次扫描待识别图像提取待识别字符的特征与特
征库中的字符特征进行匹配从而得到识别结果。图像处理中常用到的方法有图像灰度化、二值化、基于投影的字符分割等算法。常常提取的字符特征包括直接将字符图像作为字符特征或将变换后的图像作为特征,将图像在水平及垂直方向上的投影作为特征,还有字
符的笔画密度特征、外围特征、统计特征等;在字符识别这一步中常见的方法有:结构模式识别、统计模式识别、统计识别与结构识别的结合、人工神经网络、基于改进 Adaboost的方法等。
在这里插入图片描述
图 1 身份证号码识别技术的基本原理图
本文在获取字符的灰度图像后,在灰度多值化的基础上提取字符的网格特征,再利用模板匹配的方法进行识别。具体的流程包括身份证边缘定位,身份证号码区域定位及灰度归一化,身份证号码单个字符分割,特征提取和身份证号码识别等,如图 2 所示为身份证号码识别的具体流程。
在这里插入图片描述
图2 身份证号码识别的处理流程
2.1 居民身份证边缘定位
第二代居民身份证的大小是固定的,宽度为8.6 cm,高度为 5.4 cm,但是在获取身份证图像时,由于焦距的远近,不能利用它的大小信息来获取身份证在图像中所处的位置。如图 3(a)所示为通过摄像头获得的居民身份证图像,在这一步中要求背景比较简单,能和身份证形成明显对比,且身份证在图像中的位置要大体居中不能过小,以保证在图像的横向及纵向 3/8、4/8、5/8处能检测到居民身份证,这将影响到定位的结果。为了确定身份证在图像中的位置,需要对图像进行二值化,但考虑到如果对整张图像进行灰度化及二值化会消耗很多时间,分别在纵向及横向上在图像的 3/8、4/8 及 5/8 处截取宽度为 40 个像素的区域进行灰度化及二值化运算,截取的区域如图 3(b)及 3(c)所示。常用的灰度化处理方法有加权平均法、平均值法和最大值法等。这里采用加权平均法[14],根据重要性及其他指标,将 R、G、B 三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感度最高,对蓝色敏感度最低,因此,可以按公式(1),对 RGB 三个分量进行加权平
均能得到较合理的灰度图像。f (ij) = 0.299R(ij) + 0.587G(ij) + 0.114B(ij)) (1)式中,f (ij) 为像素的灰度值,R(ij) 为彩色图像中 R分量的值,G(ij) 为彩色图像中 G 分量的值,B(ij) 为彩色图像中 B 分量的值。截取的纵向及横向区域做灰度化运算后的结果如图 4(a)所示。对于二值化处理,采用了迭代法进行二值化,其思想是利用迭代的方法最终找到一个最佳的分割阈值。对于身份证图像中所选取的区域,首先遍历区域中所有
点的灰度值,找出该区域内的最大灰度值 Pmax 和最小灰度值 Pmin ,取阈值初值 T0 = (Pmax + Pmin)/2 。根据 T0 将图像分割为两部分并且分别求出各部分的灰度均值 Po 和 Pb ,进而计算新阈值 Ti + 1 = (Po + Pb)/2 。若 Ti + 1 = Ti ,则取阈值为 Ti ,否则返回继续循环迭代。在灰度图像中灰度值 i 在[0,255]这个区间内,Si 表示灰度值为 i 的像素点的个数,Ti 表示阈值,那么则有:
在这里插入图片描述
在这里插入图片描述
经过二值化运算后的区域,在边缘处与背景区分得很明显,如图 4(b)为纵向区域在二值化后的结果。再通过从上到下的搜索及从下向上的搜索就很容易确定居民身份证上下边缘在图像中 3/8、4/8 及 5/8 处的三个边缘点坐标。
在这里插入图片描述
如图 5 所示为根据二值化结果确定的居民身份证上下边缘三个点的位置,分别为上边缘 A1(左)、A2(中)、A3(右)及下边缘 B1(左)、B2(中)、B3(右)。由于光照等其他因素的影响,寻找到的边缘点并不一定是身份证的真实边缘点,这个时候需要排除其中一对点,该方法默认在中间区域即图像 4/8 处所确定的边缘点是准确的,只需要排除另一对点 A1、B1 或 A3、 B3 。以 A2、B2 为基准点,可以求得四条斜率 LA1A2、 LA3A2、LB1B2、LB3B2 ,当 |LA1A2 - LB1B2| < |LA3A2 - LB3B2| 时,则舍掉 A3、B3 这一对点,反之则舍掉 A1、B1这一对点,最后将得到上下边缘的各两个点作为居民身份证的上下边缘点,斜率 L 作为身份证在图像中旋转的斜率。同样,利用同样的方法也可以得到居民身份证左右边缘的各两个点。在知道居民身份证各条边上的两个点及求得斜率,身份证在图像中的位置也就确定了。
2.2 身份证号码区域定位及灰度归一化
身份证号码在居民身份证上的位置是固定的,在拍照获取照片时不管焦距如何变化,身份证号码所在区域相对于身份证本身的位置是不变的,它具有一定的比例关系。根据这一比例关系截取一包含身份证号码的矩形区域,如果身份证发生了旋转,即斜率 L 大于经验值
0.035时,则以该斜率为参考将矩形区域进行矫正。图 6所示为截取的身份证号码区域在经过矫正后的彩色图像。
在这里插入图片描述
图 6 身份证号码彩色区域
对得到的彩色图像利用式(1)做灰度化处理,但是因为光照的原因,有时候图像整体偏暗,有时候图像又整体偏亮,这会影响到数字字符的特征提取及最后的识别效果。因此在对图像做灰度化处理后在进行字符分割前需要将号码区域进行灰度拉伸,使得像素的灰度值分布在 0到 255间,也就是灰度归一化。
灰度归一化的方法是:对于输入图像 f (xy) ,灰度级变换 T 将产生一个输出图像 g(xy) ,且 g(xy) 的每一个像素值都是由 f (xy) 的对应输入像素点的值决定的,g(xy) = T( f (xy)) 。首先找出原图像 f (xy) 灰度的最大值max及最小值min,得到系数 k = 1.0 ´ 255/(max - min) ,那 么 对 于 图 像 f (xy) 中 的 每 一 像 素 ,利 用 变 换 T : g(xy) = ( f (xy) - min)´ k ,即 得 到 输 出 图 像 g(xy) ,
在这里插入图片描述
图 7 灰度拉伸后的身份证号码区域灰度图像
2.3 单个字符的分割及大小归一化
单个字符的分割是在求得灰度图像的分割阈值后,根据阈值进行行投影及列投影以确定每个字符的左右及上下边界,将字符的左右及上下边界坐标影射到原灰度图像,即可得到每个字符的灰度图像。常用的分割方法有阈值法、区域生长法、分裂合并法、边缘检测法、人工神经网络法、分类器和聚类法等。在这里,对于定位得到的数字区域,首先根据迭代法找出将目标(数字)与背景分割开的阈值 t ,然后根据阈值t 将图像在垂直方向上进行投影,计算每一列上灰度值小于阈值 t 的个数,对于数字间的背景区域在垂直方向上的投影值为 0,即可得到数字的左右边界坐标,再根据数字的左右边界将每个数字进行水平方向上的投影,找到数字的上边缘及下边缘,这样就可以分割出每一个字符。其中阈值 t 的计算方法[15]与前文计算阈值的方法是一样,在这不再描述。
对于分割出来的字符灰度图像,由于输入图像不同分割得到的字符图像尺寸也不相同,即使是同一幅图像中每个字符图像的尺寸也不尽相同,因此还需要将字符图像进行大小的归一化,目的是要使得字符图像与模板图像的尺寸一致。通过双线性插值算法对字符图像作
大小归一化。双线性插值[16]是利用了需要处理的原始图像像素点周围的四个像素点的相关性,通过双线性算法计算得出的。对于一个目的坐标,通过向后映射法得到其在原始图像的对应的浮点坐标 (i + uj + v) ,其中 ij均为非负整数,uv 为[0,1]区间的浮点数,则这个像素的值 f (i + uj + v) 可由原图像中坐标为 (ij)、(i + 1j)、 (ij + 1)、(i + 1j + 1) 所对应的周围四个像素的值决定,即:f (i + uj + v) = (1 - u)´(1 - v)´ f (ij) +
(1 - u)´ v ´ f (ij + 1) + u ´(1 - v)´ f (i + 1j) + u ´ v ´ f (i + 1j + 1) (4)式中 f (ij) 表示源图像 (ij) 处的的像素值,以此类推,这就是双线性内插值法。对于图 7 分割得到的单个字符图像再进行大小归一化之后的结果如图 8,设定字符尺寸为 40×72(宽 40像素,高 72像素)
在这里插入图片描述
图 8 对分割得到的字符进行大小归一化后的结果
2.4 特征提取
灰度多值化是指灰度图像 A 按照一定的法则 f 将各个像素的灰度值从 0~255变换到 0~n - 1,这个过程称为灰度多值化或 n 值化,在数学上描述为:
在这里插入图片描述
其中式(5)中 G(xy) 为图像 A 中像素的灰度值,g(xy) 为 G(xy) 经过 f 运算后的值;式(6)表示图像 A 在经过f 运算后灰度的维数从 256 维变为 n 维,当 n = 2 时,这
个过程就是人们所熟悉的灰度二值化,当 n = 26 时就是灰度 26值化。
一幅灰度图像再进行二值化处理时,会损失掉很多信息,有时还会因为图像质量问题使得二值化结果不能正确地区分出目标与背景,那么在此基础上提取到的特征也就不能有效地代表字符。如图 9 为从身份证照片中截取到的号码区域,该区域比较模糊,但是肉眼还是
能将号码识别出来;图 10 为将该号码区域进行二值化处理的结果,可以看出二值化之后目标即号码和背景没有被正确地区分开来,像数字 6、8、9 在二值化之后中间的空白区域被填充了,中间的背景像素被理解成了目标像素,使得二值化结果不能正确地反映出图像原本的信息。为此,提出将图像进行多值化处理,而不是二值化,图像中的像素被分为多类而不仅仅是被分为两类,这样可以适当减少信息的损失,在此基础上提取到的特征也
更能有效地区分出字符。
在这里插入图片描述
图 9 身份证号码的模糊图像
在这里插入图片描述
图 10 模糊图像作二值化处理后结果
在得到身份证号码字符的灰度图像后,将字符图像作 26 值化处理。为什么要将灰度图像作 26 值化处理?在身份证号码的灰度图像中,对属于同一个小区域内的像素,同属于目标或背景的两个像素的灰度值一般是差别不大的,如图 11 为身份证号码所在区域的灰度图像,在图像中间作一条水平线横穿整个图像,通过统计这条水平线上各像素的灰度值,发现在非数字区域也就是背景区域各像素的灰度值都是相差不大,在 10 个灰度级以内,同样在数字区域各像素的灰度值也是相差 10 个灰度级以内,但是数字区域和背景区域的灰度值相差可以达到 60 个灰度级,因此可以认为灰度值变化在 10 个灰度级以内的像素是同一类,在此基础上提出将灰度图像的灰度值从 256个等级作降级处理变为 26个等级,也
就是进行 26 值化,这样既能将像素进行分类又不会使原图像所包含的信息损失太大。
在这里插入图片描述
图 11 身份证号码区域的灰度图像为了提取字符的网格特征,首先将字符图像分为大小一致互不重叠的若干个小网格,对于大小为 40×72(宽 40像素,高 72像素)的字符图像,先将字符图像划分M ´ N 个网格,这里 M = 10 ,N = 12 ,再利用公式(7)将数字字符的灰度图像做 26 值化,最后利用式(8)统计每个小网格中像素灰度在 26 值化后的平均值作为该方块的特征,这些特征组合在一起构成特征向量,即得到每个数字字符的二维灰度特征。
在这里插入图片描述
其中,式(7)是将像素的灰度进行26值化处理,f (xy) 为像素的原灰度值,g(xy) 为 26值化后得到的值,即灰度值从原来的 0~255 降为 0~25;式(8)是计算第 (ij) 个网
格的特征值 E(ij),H 和 W 分别为该小方块的高和宽,g(xy) 为该小方块中像素灰度 26值化后的值,0  x < W, 0  y < H ,0  i < M ,0  j < N 。那么字符的特征向量则
等于
在这里插入图片描述
2.5 字符识别
字符识别就是将待识别字符的特征向量与模板库中保存的每个字符的特征向量进行匹配,找到与待识别字符匹配的字符。本文用到的匹配方法是通过求相似度,相似度最大的即认为是与待识别字符匹配的字符。求相似度的方法如下:
在这里插入图片描述
式中 S 定义为相似度,Ts(ab) 为待识别字符的特征属性,To(ab) 为模板的特征属性。

⛄二、部分源代码

function varargout = homework2(varargin)
% HOMEWORK2 M-file for homework2.fig
% HOMEWORK2, by itself, creates a new HOMEWORK2 or raises the existing
% singleton*.
%
% H = HOMEWORK2 returns the handle to a new HOMEWORK2 or the handle to
% the existing singleton*.
%
% HOMEWORK2(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in HOMEWORK2.M with the given input arguments.
%
% HOMEWORK2(‘Property’,‘Value’,…) creates a new HOMEWORK2 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before homework2_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to homework2_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE’s Tools menu. Choose “GUI allows only one
% instance to run (singleton)”.
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help homework2

% Last Modified by GUIDE v2.5 20-May-2013 21:21:00

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @homework2_OpeningFcn, …
‘gui_OutputFcn’, @homework2_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
% End initialization code - DO NOT EDIT

% — Executes just before homework2 is made visible.
function homework2_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to homework2 (see VARARGIN)

% Choose default command line output for homework2
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes homework2 wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% — Outputs from this function are returned to the command line.
function varargout = homework2_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

%载入原始身份证图像的回调函数
% — Executes on button press in OriginalImg.
function OriginalImg_Callback(hObject, eventdata, handles)
% hObject handle to OriginalImg (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[FileName,PathName] = uigetfile(‘*.jpg’,‘Select an image’);
if PathName~=0
str = [PathName,FileName];
T=imread(str);
axes(handles.Img);
imshow(T);
end

%图像自动亮度调整的回调函数
% — Executes on button press in autoLight.
function autoLight_Callback(hObject, eventdata, handles)
% hObject handle to autoLight (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.Img);
T=getimage;

low_out=0.2; high_out=0.9;
gamma=1.518;
hsv=rgb2hsv(T);
I=hsv(:,:,3);
minL=min(min(I));
maxL=max(max(I));
J=imadjust(I,[minL;maxL],[low_out;high_out],gamma);
hsv(:,:,3)=J;
rgb_atuoI=hsv2rgb(hsv);
axes(handles.Light);
imshow(rgb_atuoI);

%图像二值化的回调函数
% — Executes on button press in DIP.
function DIP_Callback(hObject, eventdata, handles)
% hObject handle to DIP (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.Img);
I=getimage;
[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; %绿色分量
I(i,j,3)=40; %蓝色分量
end
end
end
%figure, imshow(I);title(‘变色后的图像’);

width=round(0.9n);height=round(0.87m);
rx=round(0.05n);cy=round(0.075m);
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);

[n m l]=size(BW);%图像的像素为mn
c = [0.65
m 0.65m m m];
r = [0 0.85
n 0.85*n 0];
BW = roifill(BW,c,r);

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));
% 滤波
%h=fspecial(‘average’,1);
%BW=im2bw(round(filter2(h,BW)));
%imwrite(d,‘4.均值滤波后.jpg’);
axes(handles.Binary);
imshow(BW);

%图像分割与识别按钮的回调函数
% — Executes on button press in OCR.
function OCR_Callback(hObject, eventdata, handles)
% hObject handle to OCR (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.Binary);
imagen = getimage;
[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;
%Opens text.txt as file for write
fid = fopen(‘ID_card.txt’, ‘wt’);
% Load templates
load templates
global templates
% Compute the number of letters in template file
num_letras=size(templates,2);
figure;
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(flag1)
if char_flag
0
[r,c] = find(Ln);
Width0=max®-min®;%连通域宽度
Height0=max©-min©;%连通域高度
Radio0=Width0/Height0;%连通域宽高比
Square0=Width0*Height0;%连通域面积
maxr=max®;
maxc=max©;
minr=min®;
minc=min©;
end
if n<Ne
[r1,c1] = find(L
(n+1));%寻找下一个连通域
Width1=max®-min®;%连通域宽度
Height1=max©-min©;%连通域高度
Radio1=Width1/Height1;%连通域宽高比
Square1=Width1Height1;%连通域面积
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(flag1)&&((Owidth>=-(image_w/pw)&&Owidth<=0)||(Oheigth>=-(line_h0.3)&&Oheigth<=0))%两个连通域较近,但不重叠
if((Uradio>=0.8)&&(Uradio<=1.2))%认为两个连通域属于同一个字符
elseif Uheight<line_h
0.4;%连通域的合并之后高度过小的,认为是一个字符的一部分,很可能是边旁部首
else flag=0;%否则这两个连通域属于不同字符
end
elseif(flag
1)&&(Owidth<-(image_w/pw))%两个连通域里相距较远
flag=0;%两个连通域属于不同字符
% elseif(flag1)&&((Owidth>0)||(Oheigth>0))%两连通域重叠
elseif(flag
1)&&((Owidth>0))%两连通域重叠
if(((Uradio>=0.78)&&(Uradio<=1.3)))%认为两个连通域属于同一个字符
elseif(Osquare>=0.4min(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]);
    subplot(10,10,plot_flag),imshow(img_r);title(plot_flag);
    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)
fprintf(fid,'%s\n',word);%Write 'word' in text file (upper)
% Clear 'word' variable
word=[ ];
%*When the sentences finish, breaks the loop
if isempty(re)  %See variable 're' in Fcn 'lines'
    break
end    

end
fclose(fid);
%Open ‘ID_card.txt’ file
winopen(‘ID_card.txt’)

% — Executes on button press in Exit.
function Exit_Callback(hObject, eventdata, handles)
% hObject handle to Exit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
clc;
close all;
close(gcf);

⛄三、运行结果

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]李开,陈礼安,曹计昌.基于灰度多值化的身份证号码识别[J].计算机工程与应用. 2015,51(13)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值