✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
算法流程1、输入身份证明图片;2、根据几项信息确定职位身份验证码职位设置并切割;3、利用连接域计算法切字符;4、利用模板匹配算法进入行识别
数学形态学分为值形态学和形态学形态学,灰度灰度形态学二值二值形态形态学扩展扩展扩展而而而来来来来来。。。。数学数学数学数学数学数学数学数学数学数学数学数学形态学形态学形态学形态学形态学形态学形态学形态学形态学形态学形态学形态学形态学形态学形态学形态学形态学形态学结合又形成了开运算和闭运算。开运算就是先腐朽再腐朽,闭运算就是先腐朽再腐朽。
1 二值形态学粗略的说,腐朽可以使目标区域范围“变小”,其实质制造成图像的边界收窄,可以用来消去小而无意的目标标子:呔子。by a,a,需要是是是是需要原点原点原点原点原点原点原点原点原点原点原点当B的原点平移到图像A的像元(x,y)时,如果B在(x,y)处,完全被包含在图像A重迭的区域也域,(就是B中为1的元素位置上对应的A图形值全部也为1)则将输出图形对应的图形元(x,y)赋值为1,否则赋值为0。我们看一个表演图。B依顺顺序在A上移动(和卷积核在图像上移动一样,然后在B的外壳域上进行形状学运算),当其外壳A的区域为[1,1;1,1]或[1 ,0;1,1]时,(也就是B中'1'是覆盖区域的子集)对输出图像的位置才会为1。
2 膨胀粗略地说,“变”,“,”,将将接触接触背景点合并目标物中中中中去除包含在目标区域中的小颗粒噪音。该式子表示用结构B膨胀A,将结构元素B的原点平移到图形像元(x,y)位置。如果B在图形像元(x,y)处与A的交集就不是空( B中为1的元素位置上对应A的图形直至有一个为1),则输出图形对应的图形元(x,y)赋值为1,否则赋值为0。演示图为:3 小结也就还是,都还是膨胀膨胀膨胀元素元素元素元素元素把那样那样那样那样那样那样元素上。只是不过腐朽是B被完整包裹在其所覆盖的区域,膨胀时B与其他所覆盖的区域有交集即可。
4灰度形态学在讲述灰度值形态学之前,我们进行一个约定,即将结束结构元素B覆盖住的图像A的区域记为P(取部分之意)。
5 灰度形态学的腐蚀那么灰度形状学中的腐殖质就是类似卷积的一种操作,用P减去结构元素B形状的小石头形状,取其中最小的赋值到对应点的位置即可。我们来看一个实例,进行深度对灰度形态学的解释。假设我们有如下的图像A和结构元素B:进行灰度形态学腐蚀的过程如下:我们输出个元素的输出结果的的的展示展示展示展示的展示展示的展示的是是原点原点原点原点对应对应对应对应对应对应的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的就是被减数矩阵,然后在其差矩阵中求min(最小值)来作为原点对应位置的值。灰度形态学的膨胀根据描述,我们的描述描述描述描述描述,灰度,灰度形态学的的中中中的的膨胀膨胀就就就就就是是是是类似类似类似类似卷积卷积卷积卷积一操作操作操作操作操作元素B的原点所对应的位置。这里也对输出图像第一个元素价值的来历做一个说明。对上面矩阵的和要求最大的值就是6,所以把6赋值给结构元素原点所对应的位置。
6 小结这里概念,这里概念概念概念这里一各自原图像图像图像图像图像,因为因为原图像原原原原原原相比较于相比较于相比较于相比较于相比较于相比较于相比较于腐蚀的的的的的结果结果结果要使得使得各像之前更度值膨胀的结果会使各元比之之前的变化更大,所以适用于去除低谷噪音。
⛄ 部分代码
function [ id_codes,ibw,id_bw,code_stats,thresh,iteration ] = id_rec_process( img_gray,model,thresh,training_data_size,iteration )
narginchk(1,5) %验证当前执行的函数调用中的输入参数数目。如果调用中指定的输入数目小于1或大于5,narginchk 将引发错误。如果输入数目在1与5之间(包括二者),则 narginchk 不会执行任何操作。
if nargin==1 %参数数目等于1
model=[];
elseif nargin<=2 || thresh==0
thresh=.68*graythresh(img_gray); %使用 Otsu 方法计算全局图像阈值
elseif nargin<=3
training_data_size=[47 31];
elseif nargin<=4 || isempty(training_data_size)
iteration=1;
end
% fprintf('Iteration %d, threshold value: %f\n',iteration,thresh)
bw=~imbinarize(img_gray,thresh); %基于阈值将图像转换为二值图像 再取反
ibw=bwareaopen(bw,10);%bwareaopen(BW,P) 从二值图像BW中删除少于P个像素的所有连通分量;
bw=imclearborder(ibw);
% imclearborder(I)抑制图像中比周围环境轻且连接到图像边框的结构。使用此功能可清除图像边框。简单说,这个函数的作用就是:把与图像边界相连接的像素全部清除。
bwc=imdilate(bw,strel('disk',6)); %strel('disk',r,n) 创建一个圆盘形结构元素,其中r指定半径,n指定用于逼近盘形的线条结构元素的数量。n缺省时值是4。注:形态学操作在N>0情况下要快于N=0的情形。
% imdilate(I,SE) 使用结构元素SE膨胀灰度、二值或压缩二值图像 I。
code_stats=regionprops(bwc,'Area'); %regionprops(BW,properties) 返回二值图像BW中每个8连通分量(对象)的属性集的测量值。'Area':计算出在图像各个区域中像素总个数。区域中的实际像素数。
%代码结构体,1×1 struct 包含一个字段Area 例如:值6248
step_ratio=1.1; %阶比
if isempty(code_stats) && thresh*step_ratio<1
[id_codes,ibw,id_bw,code_stats,thresh,iteration]=id_rec_process(img_gray,model,thresh*step_ratio,training_data_size,iteration+1);%再次调用执行。
return
end
id_codes=blanks(18); %创建空白字符数组
if isempty(code_stats)
id_bw=bw;
return
end
[~,midx]=max([code_stats.Area]); %在matlab中~表示占位 忽略输出参数,只需要第二个参数
mask=bwlabel(bwc)==midx; %bwlabel 对二维二值图像中的连通分量进行标注;L = bwlabel(BW) 返回标签矩阵L,其中包含在BW中找到的8连通对象的标签。
%先计算bwlabel(bwc)==midx,如果bwlabel(bwc)恒等于midx成立则返回1,如不成立则返回0
id_bw=imreconstruct(mask,bw); %形态学重建
code_stats=regionprops(id_bw,'Image','Extent'); %测量图像区域的属性,代码属性;
% 'Image'与区域的边界框大小相同的图像,以二值 (logical)数组形式返回。on像素对应于该区域,所有其他像素为off。与某区域具有相同大小的逻辑矩阵,可以直接将每个子区域提取出来。
% 'Extent'区域中的像素数与边界框中总像素数的比率,以标量形式返回。计算方法为Area除以边界框的面积。即同时在区域和其最小边界矩形中的像素比例。
%18×1 struct包含2个字段Image和Extent 每一块区域的二值数组图和每一块的像素数占该块总数的比
if length(code_stats)~=18 && thresh*step_ratio<1
[id_codes,ibw,id_bw,code_stats,thresh,iteration]=id_rec_process(img_gray,model,thresh*step_ratio,training_data_size,iteration+1);
return
end
if length(code_stats)==18
inputs=zeros(training_data_size(1)*training_data_size(2),18);
for i=1:size(inputs,2)
img=imresize(code_stats(i).Image,training_data_size);
inputs(:,i)=img(:);
end
% predict 预测
if ~isempty(model)
try
output=model(inputs); %输入模型,结果输出
[~,midx]=max(output);
count=size(output,2);
for i=1:count
switch midx(i)
case 1
id_codes(i)='X';
otherwise
id_codes(i)=num2str(11-midx(i));
end
end
catch e %捕获 .NET 异常的错误信息
disp(e)
for i=1:length(e.stack)
disp(e.stack(i))
end
end
end
end
end
⛄ 运行结果
⛄ 参考文献
[1]贾震斌, 田立炎. 基于BP神经网络的身份证号码识别算法[J]. 苏州市职业大学学报, 2006, 17(3):3.