关于Matlab图像处理的问题,提取校卡图片里的学号,并给数字排序。

img


如图,我的代码目前能够识别并提取出校卡上我的学号,先需要在此基础上程序能够再识别出学号中数字最大和最小的数字以及这两个数字所在的位置。我的代码如下,希望有好人能帮我继续完成这个程序🫡 好人一生平安

clc;clear;close all;
[FileName,PathName]=uigetfile({'.jpg','JPG 图片';'.bmp','BMP 图片'; '.gif','GIF 图片';'.png','PNG 图片'},'?打开校卡图片','MultiSelect','off');
f=imread([PathName,FileName]);
f0=~im2bw(f);
imshow(f0);
%用 ginput 函数,确定图像上的两点,返回两点的坐标
[x,y]=ginput(2);
result=imcrop(f0,[x(1),y(1),abs(x(1)-x(2)),abs(y(1)-y(2))]);
%获得两点的坐标,截取图上两点的区域
[r,c]=find(result);
nextresult=result(min(r):max(r),min(c):max(c));
imshow(nextresult)
%对截取下来的区域的图片进行分割,获得一个个数字的图片
[h,w]=size(nextresult);%h 代表行数,w 代表列数
hs=sum(nextresult);%对 nextresult 每一列的元素进行求和,输出hs 为一个横向量
a=1;
b=1;
i=1;%a 为遍历列数的初始值,
splitfs={};
points=[];
figure%保留图形
while(a<w)
while(hs(a)==0&&a<w)%截去空白部分:遍历 hs 横向量,在最后一个元素之前,当元素值为 0 时,跳过这些元素,当前 a 为数字部分开始出现的位置
a=a+1;
end
b=a;
while(hs(b)>0&&b<w)%截取数字部分:遍历 hs 横向量,在最后一个元素之前,当元素值大于 0 时,保留这些元素,当前 b 为与前面a 位置对应的同一个数字的结束位置
b=b+1;
end

if(b-a>2)
    hresult=nextresult(:,a:b);
    [r,c]=find(hresult);
    result2=hresult(min(r):max(r),:);
    m=min(r);%用 m 保存每个数字图形最小行
    n=max(r);%用 n 保存每个数字图形的最大行
    xi=hresult(m:n,:);
    splitfs{i}=xi;%截出来的图片保留为一个元胞数组
    points=[points;m,n,a,b];%存放每个截出来的数字的最小行和最大行,最下列和最大列
    subplot(3,4,i);%输出图像的放在第 i 个位置
    imshow(result2);
    i=i+1;
end
a=b;%把 b 的值赋值给 a,开始进入下一循环

end
%将分割好的图片与 0-9 的图片进行比较输出
xs=[splitfs,points];%储存上面所截取出来的每一个数字及其位置
fonts='0123456789';
picSize=[20,40];%预置图片的大小
lastresult='学号:';
for m_18=1:size(xs,2)-1%遍历每一个截出来的数字,在下面一一做比较
p=xs{m_18};%当前的数字赋值在变量 p 中
p=imresize(p,picSize,'nearest'); %将所截取的数字图片大小改到预置的图片大小(按照最近邻插值的方法)
for n_10=1:10 %在这里开始与字符模板中的字符一一做比较
q=imread(strcat(int2str(n_10),'.jpg'));
q1=im2bw(q);
q1=imresize(q1,picSize,'nearest'); %将所截取的数字图片大小改到预置的图片大小(按照最近邻插值的方法)
matchrs(n_10)=corr2(p,q1);%用 corr2 函数求所截取的数字与字符模板的数字对比的相关系数,并保存在向量中
end
[,k]=max(matchrs);%找出相关系数矩阵中最大值所对应的位置,这个位置刚好就对应在前面预置的 0
lastresult=strcat(lastresult,fonts(k));
end
lastresult%输出识别得到的结果