matlab 号,Matlab ID号识别码

aeedb93df77680c69f7b95bee353d2ea.png

%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);

%数字;

50c33eaaa087c34439ae82644aa4bc75.png

%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之间的连接域)

8afa17a0fa66b0255aed3e2dd7517a77.png

如果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,它们是每个切割的起点和终点,以及它们的计算方法

6f8c637b36319d563663c049477497aa.png

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,则从上至下

a84384f8d6b974f4a81af05baa3ea81f.png

%并非全部为零时结束

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值