%ID卡识别程序. 识别ID卡上的ID号,然后分别提取以形成仅保留ID号的二进制区域图像
clc;
清除所有;
关闭所有;
A =未读('E: \张强\ matlab程序调试2015 \ matlab程序调试〜示例\ id_indentification_pic.jpg');%已读入图像
I1 = rgb2灰色(A);%灰度处理,自动二值化
level =灰色阈值(I1);
I2 = im2bw(I1,级别);
I3 =〜I2;
图;
imshow(I3);
I4 = bwareaopen(I3,25);%去除小区域(降噪)
I =〜I4;
%数字;
%inshow(I4);
[y x] =大小(I);%首先确定ID编号所在的大致区域(ID编号位于ID的右下角)
A2 =即刻(I,[x / 3y / 22 * x / 3y / 2]);
%数字;
%即时展示(A2);
se = strel('square',40);%执行打开操作以使图像形成多个连接的域
bw = imopen(A2,se);
%数字;
%imshow(bw);
%%%%%%%找到连接域的边缘,并绘制每个连接域的边界
[B,L] = bwboundaries(bw,4);%使用了函数bwboundaries
图;
imshow(label2rgb(L,@ jet图像库,[. 5.5.5]));%label2rgb将标签矩阵转换为彩像
保持;
对于k = 1: 长度(B)
边界= B {k};
图(边界(: ,2),边界(: ,1),'r','LineWidth',2);%绘制对象的边界
结束
%找到每个连接域的质心和面积
stats = regionprops(L,“ Area”,“ Centroid”);
%%%%%%%遍历每个连接域的边界,以获取匹配特征范围内的对象(即,切出ID号的位置图片)
对于k = 1: 长度(B)
boundary = B {k};%获得边界上的所有点
delta_sq = diff(边界). ^ 2;%计算边界周长
perimeter = sum(sqrt(sum(delta_sq,2)));%计算边界周长
area =统计(k).Area;%表示边界所包围的面积
metric = 80 *面积/周长^ 2;%计算匹配度
要显示的匹配字符串%
metric_string = sprintf('%2.2f',指标);%在图形上显示字符串(匹配度的值)
%%%%%%标记匹配度接近1的连接域(仅绘制匹配度在0.8到1.1之间的连接域)
如果metric> = 0.8 &&
centroid =统计(k).Centroid;
图(质心(1),质心(2),'ko');%绘制相应的质心
%提取二进制图像中与连接域相对应的矩形区域
goalboundary =边界;
s = min(目标边界,[],1); %%%如何具有两个参数
e =最大值(目标边界,[],1);
%将目标区域向两侧扩展7个像素
目标= imcrop(A2,[s(2)-7s(1)e(2)-s(2)+ 14e(1)-s(1)]);
结束
%显示匹配字符串
文本(边界(1,2)-35,边界(1,1)+13,...
metric_string,“颜色”,“ g”,...
'FontSize',14,'FontWeight','bold');
结束
目标=〜目标;%反转目标区域
图,imshow(目标)
%%%%分别提取18个字符并将其显示在同一图中
%求出目标区域的长度,并等分为18个字符后求出长度
cs =大小(目标2);
sz = cs / 18;
%定义变量t1和t2,它们是每个切割的起点和终点,以及它们的计算方法
t1 =(0:17)* sz +1;
t2 =(1:18)* sz;
%%%%将分别切出字符并将它们显示在同一图中
图;
k = 0;
%剪切并从左到右提取目标区域(对于每个单个字符块(对应于相应字符块的矩阵))
对于i = 1: 18%每个ID卡上的ID号包含18个字符
%temp =目标(: ,t1(i): t2(i),: );
temp =目标(: ,t1(i): t2(i));
temp = bwareaopen(温度为20);%减少了剪切图像的噪声(去除了较小的区域)
temp = id_identification_qiege(temp);%调用自写子功能(对图像进行进一步处理以删除每个字符周围的所有零行)
temp =不可变大小(temp,[30,20]);%将temp缩放为[30,20]指定的大小. 指定宽度和高度
k = k +1;
子图(1,18,k);%在窗口中同时显示最后一个字符
imshow(temp);
结束
您自己编写的子功能
%定义功能功能切割
函数e = id_identification_qiege(d)
[m,n] =尺寸(d);%确定图像尺寸
top = 1;底部=米;左= 1; right = n;%初始定义顶部底部底部右侧
%从第一行开始,从上到下,如果该行的总和为0,则从上至下
%并非全部为零时结束
while sum(d(top,:))== 0 && top
top = top +1;
结束
%从最后一行开始,从下到上. 如果此行的总和为0,并且bottom> = 1,则底部将减少1%,并在不全为0时结束
while sum(d(bottom,:))== 0 && bottom> = 1
bottom = bottom-1;
结束
%从第一列开始,从左到右,如果该行的总和为0,则为左
%并非全部为零时结束
while sum(d(: ,left))== 0 && left
左=左+1;
结束
%从最后一列开始,从右到左,如果该行的总和为0图像库,则为左
%并非全部为零时结束
同时求和(d(: ,right))== 0 && left
right = right-1;
结束
%确定切割范围
dd =右-左;
hh =自下而上;
e = imcrop(d,[left top dd hh]);
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-230437-1.html