目的:利用matlab将身份证号码切割出来
效果:
1. 思路
先把图片转换为二值图,然后利用腐蚀膨胀和图像重建,找到号码所在位置,切割出来。
2. 步骤
-
先把图像转换为二值图,由图像知,为了将需要区域变成白色,需要对二值图进行取反
该步代码为:clear,clc,close all; f=imread('id.jpg'); g=rgb2gray(f); b=~imbinarize(g,0.5); imshow(b),title('原图');
-
观察可知,为了利用图像重建,可以将身份证号码所在区域利用膨胀连通到一块
该步代码为:f1=imdilate(b,strel('line',20,0)); %利用长度为20的横线进行膨胀 figure,imshow(f1),title('膨胀');
-
利用横线进行腐蚀,去除不需要的连通区域
观察膨胀后的图片可以发现,人物头像所占区域较大,而号码所在区域特点为较长,因此可以使用横线进行腐蚀,当横线的长度略小于号码的长度时,可以达到将比横线长度小的白色区域均腐蚀掉,而较长的身份证号码的中间的一部分会保留下来,可以再利用重建将所有号码的部分找回。
该步新增代码为:f2=imerode(f1,strel('line',200,0)); %横线的长度尽可能长一些,才能达到去除头像的目的 figure,imshow(f2),title('腐蚀');
-
利用得到的小区域在上面膨胀后的图中重建,找到所有号码所在的连通区域
该步新增代码为:f3=imreconstruct(f2,f1); figure,imshow(f3),title('第一次重建');
-
利用所有号码所在的连通区域,在二值图重建,找出图中身份证的号码
该步新增代码为:f4=imreconstruct(f3,b); figure,imshow(f4),title('结果');
-
利用find()函数对身份证号码进行切割
本例代码为:
clear,clc,close all;
f=imread('id.jpg');
g=rgb2gray(f);
b=~imbinarize(g,0.5);
imshow(b),title('原图');
f1=imdilate(b,strel('line',20,0));
figure,imshow(f1),title('膨胀');
f2=imerode(f1,strel('line',200,0));
figure,imshow(f2),title('腐蚀');
f3=imreconstruct(f2,f1);
figure,imshow(f3),title('第一次重建');
f4=imreconstruct(f3,b);
figure,imshow(f4),title('结果');
[r,c]=find(f4);
f5=f4(min(r):max(r),min(c):max(c));
figure,imshow(f5),title('号码');