function varargout = main(varargin)
% 开始初始化代码 - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @main_OpeningFcn, ...
'gui_OutputFcn', @main_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% 结束初始化代码
pause(1);
% 执行之前主要是可见的。
function main_OpeningFcn(hObject, eventdata, handles, varargin)
set(handles.process,'enable','on')
% 此函数没有输出参数,见 OutputFcn.
% main的选择默认的命令行输出
handles.output = hObject;
% 更新handles 结构
guidata(hObject, handles);
% UIWAIT 等待用户响应 (see UIRESUME)
% uiwait(handles.figure1);
% --- 这个函数的输出返回到命令行。
function varargout = main_OutputFcn(hObject, eventdata, handles)
tic
% 获得缺省命令行输出的把手结构
varargout{1} = handles.output;
% --- 执行按钮在pushbutton1。
function pushbutton1_Callback(hObject, eventdata, handles)
[filename pathname]=uigetfile({'*.jpg';'*.bmp'}, 'File Selector');
I = imread([pathname '\' filename]);
handles.I = I;
% 更新处理结构
guidata(hObject, handles);
axes(handles.axes1);
imshow(I);title('原始图片')
set(handles.process,'enable','on')
% --- 执行过程中按下按钮。
function process_Callback(hObject, eventdata, handles)
set(handles.edit3,'string','正在识别!请稍候...');
I = handles.I;
I1=rgb2gray(I);;%rgb2gray转换成灰度图
guidata(hObject, handles);
axes(handles.axes2);
imshow(I1);title('灰度图');
axes(handles.axes3);
imhist(I1);title('灰度图直方图');
%继续
pause(2);
I2=edge(I1,'roberts',0.15,'both');
guidata(hObject, handles);
axes(handles.axes2);
imshow(I2);title('robert算子边缘检测');
pause(2);
se=[1;1;1];
I3=imerode(I2,se);
guidata(hObject, handles);
axes(handles.axes3);
imshow(I3);title('腐蚀后图像');
%继续
pause(2);
se=strel('rectangle',[10,25]);%生成一个矩阵
I4=imclose(I3,se);%闭运算
guidata(hObject, handles);
axes(handles.axes2);
imshow(I4);title('平滑图像的轮廓');
%继续
pause(2);
I5=bwareaopen(I4,2000);%小于2000的对象都被删除
guidata(hObject, handles);
axes(handles.axes2);
imshow(I5);title('从对象中移除小对象');
%继续
pause(2);
[PY2,PY1,PX2,PX1]=chepai_fenge(I5);%调用分割车牌
global threshold;
[PY2,PY1,PX2,PX1,threshold]=chepai_xiuzheng(PY2,PY1,PX2,PX1);%调用车牌校正
IY=I(PY1:PY2,:,:);
Plate=I5(PY1:PY2,PX1:PX2);%使用caitu_tiqu
global dw;
dw=Plate;
PX1=PX1-1;%对车牌区域的校正
PX2=PX2+1;
dw=I(PY1:PY2,PX1:PX2,:);
axes(handles.axes2);
imshow(dw),title('区域的校正');
pause(2);
t=tic;
guidata(hObject, handles);
axes(handles.axes2);
imshow(IY),title('水平方向合理区域');
axes(handles.axes3);
imshow(dw),title('定位剪切后的彩色图像');
pause(2);
imwrite(dw,'New number plate.jpg');
%[filename,filepath]=uigetfile('New number plate.jpg','输入一个定位裁剪后的车牌图像');
%jpg=strcat(filepath,filename);
a=imread('New number plate.jpg');
b=rgb2gray(a);%对定位后的车牌灰度化
figure(3),subplot(3,2,1),imshow(b),title('灰度图像');
g_max=double(max(max(b)));
g_min=double(min(min(b)));
T=round(g_max-(g_max-g_min)/2); %T 为二值化的阈值
[m,n]=size(b);
d=(double(b)>=T); % d:二值图像
figure(3),subplot(3,2,2),imshow(d),title('二值图像');
figure(3),subplot(3,2,3),imshow(d),title('均值滤波前');
pause(1);
h=fspecial('average',3); %均值滤波器
d=im2bw(round(filter2(h,d)));
figure(3),subplot(3,2,4),imshow(d),title('均值滤波后');
se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵
%字符面积与车牌面积之比在(0.235,0.365)之间
[m,n]=size(d); %如果大于0.365则对图像进行腐蚀,如果小于0.235则对图像进行膨胀
if bwarea(d)/m/n>=0.365%计算面积
d=imerode(d,se);%imerode 实现图像腐蚀 d为待处理图像,se是结构元素对象
elseif bwarea(d)/m/n<=0.235
d=imdilate(d,se);%imdilate 图像膨胀
end
figure(3),subplot(3,2,5),imshow(d),title('膨胀或腐蚀处理后');
pause(2);
saveas(3,'3.fig');
close 3;
% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
d=zifufenge(d);
[m,n]=size(d);
guidata(hObject, handles);
axes(handles.axes3);imshow(d);
k1=1;k2=1;s=sum(d);j=1;
while j~=n
while s(j)==0
j=j+1;
end
k1=j;
while s(j)~=0 && j<=n-1
j=j+1;
end
k2=j-1;
if k2-k1>=round(n/6.5)
[val,num]=min(sum(d(:,[k1+5:k2-5])));
d(:,k1+num+5)=0 % 分割
end
end
% 再分割
d=zifufenge(d);
% 切割出 7 个字符
y1=10;y2=0.25;flag=0;word1=[];
while flag==0
[m,n]=size(d);
left=1;wide=0;
while sum(d(:,wide+1))~=0
wide=wide+1;
end
if wide<y1 % 认为是左侧干扰
d(:,[1:wide])=0;
d=zifufenge(d);
else
temp=zifufenge(imcrop(d,[1 1 wide m]));
[m,n]=size(temp);
all=sum(sum(temp));
two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));
if two_thirds/all>y2
flag=1;word1=temp;
end
d(:,[1:wide])=0;
d=zifufenge(d);
end
end
% 分割出第二个字符
[word2,d]=getword(d);
pause(1);
% 分割出第三个字符
[word3,d]=getword(d);
pause(1);
% 分割出第四个字符
[word4,d]=getword(d);
pause(1);
% 分割出第五个字符
[word5,d]=getword(d);
pause(1);
% 分割出第六个字符
[word6,d]=getword(d);
pause(1);
% 分割出第七个字符
[word7,d]=getword(d);
pause(1);
guidata(hObject, handles);
axes(handles.axes4);imshow(word1),title('1');
guidata(hObject, handles);
axes(handles.axes4);imshow(word2),title('2');
guidata(hObject, handles);
axes(handles.axes4);imshow(word3),title('3');
guidata(hObject, handles);
axes(handles.axes4);imshow(word4),title('4');
guidata(hObject, handles);
axes(handles.axes4);imshow(word5),title('5');
guidata(hObject, handles);
axes(handles.axes4);imshow(word6),title('6');
guidata(hObject, handles);
axes(handles.axes4);imshow(word7),title('7');
[m,n]=size(word1);
% 商用系统程序中归一化大小为 40*20,此处演示
word1=imresize(word1,[40 20]);
word2=imresize(word2,[40 20]);
word3=imresize(word3,[40 20]);
word4=imresize(word4,[40 20]);
word5=imresize(word5,[40 20]);
word6=imresize(word6,[40 20]);
word7=imresize(word7,[40 20]);
guidata(hObject, handles);
axes(handles.axes4);imshow(word1),title('1');
guidata(hObject, handles);
axes(handles.axes5);imshow(word2),title('2');
guidata(hObject, handles);
axes(handles.axes6);imshow(word3),title('3');
guidata(hObject, handles);
axes(handles.axes7);imshow(word4),title('4');
guidata(hObject, handles);
axes(handles.axes8);imshow(word5),title('5');
guidata(hObject, handles);
axes(handles.axes9);imshow(word6),title('6');
guidata(hObject, handles);
axes(handles.axes10);imshow(word7),title('7');
imwrite(word1,'1.jpg');
imwrite(word2,'2.jpg');
imwrite(word3,'3.jpg');
imwrite(word4,'4.jpg');
imwrite(word5,'5.jpg');
imwrite(word6,'6.jpg');
imwrite(word7,'7.jpg');
liccode=char(['0':'9' 'A':'Z' '桂鲁苏豫京国家安全你我他']); %建立自动识别字符代码表
SubBw2=zeros(40,20); %初始值归为0矩阵
l=1;
for I=1:7
ii=int2str(I);%将整数转换为字符串
t=imread([ii,'.jpg']);
SegBw2=imresize(t,[40 20],'nearest');%实用最近邻插值法放大图像
% if l==1 %第一位汉字识别
kmin=37;
kmax=48;
pause(1);
% elseif l==2 %第二位 A~Z 字母识别
% kmin=11;
% kmax=36;
% pause(1);
% else l>=3 %第三位以后是字母或数字识别
% kmin=1;
% kmax=36;
% end
for k2=kmin:kmax
fname=strcat('模板库\',liccode(k2),'.jpg'); %读取字符模板库中的图像
SamBw2 = (imread(fname));
if ndims(SamBw2) == 3%如果图片是3维(彩图)
SamBw2 = rgb2gray(SamBw2);%转成灰图
end%结束
for i=1:40
for j=1:20
SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
end
end
% 以上相当于两幅图相减得到第三幅图
Dmax=0;
for k1=1:40
for l1=1:20
if ( SubBw2(k1,l1) > 0 || SubBw2(k1,l1) <0 )
Dmax=Dmax+1; %如果两幅图像对应的图像相
没有合适的资源?快使用搜索试试~ 我知道了~
基于matlab中文汉字识别系统+GUI操作界面的毕业设计(完整代码+说明文档+数据)

共90个文件
jpg:80个
m:5个
fig:2个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉

温馨提示
1、资源内容:基于matlab中文汉字识别系统+GUI操作界面的毕业设计(完整代码+说明文档+数据) 2、代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 3、适用对象:计算机,电子信息工程、数学等专业的大学生课程设计和毕业设计。 4、更多仿真源码下载列表(自行寻找自己需要的):https://blog.csdn.net/m0_62143653?type=download 5、作者介绍:某大厂资深算法工程师,从事Matlab、Python、C/C++、Java、YOLO算法仿真工作10年;擅长计算机视觉、目标检测模型、智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、智能控制、路径规划、无人机等多种领域的算法仿真实验,欢迎交流学习。
资源推荐
资源详情
资源评论

























收起资源包目录






























































































共 90 条
- 1
资源评论

- zhoucong121232023-05-16资源太好了,解决了我当下遇到的难题,抱紧大佬的大腿~
- 2301_778808292023-05-12资源很受用,资源主总结的很全面,内容与描述一致,解决了我当下的问题。
- Mscso272572023-04-07总算找到了自己想要的资源,对自己的启发很大,感谢分享~

Matlab仿真实验室
- 粉丝: 189
- 资源: 1360
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


会员权益专享
最新资源
- ChatGPT开发食品安全客诉分析系统,附加代码实现.docx
- TACRED数据集下载
- JSP+SQL网上选课系统的设计与实现(源代码+毕设+答辩PPT).zip
- 基于springboot的沁园健身房预约管理系统的设计与实现
- Scratch作品:Codecraft基岩版
- 基于springboot的时间管理系统的设计与实现PPT
- jsp+sql网络书店销售管理系统的设计与实现(毕设+源代码+任务书+开题报告+中期检查表+摘要+英文文献).zip
- 【openEuler 20.03 TLS编译openGauss2.0.0源码】
- 小型电子感应加速器电磁场的设计与实现_杨志强.caj
- 中期答辩-周长玉.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
