在RCNN问世之前传统的方法为OCR提取,将OCR提取到的字符进行归一化处理,再使用CNN或者SVM进行识别
下列为搭建的一个简易操作截面,流程为按钮部分:
第一步:选择图像
选择指定图像显示在左侧坐标区域,稍后的OCR操作也是在左侧的AXES1内完成。
global I;
[filename, filepath]=uigetfile('*.bmp;*.jpg;*.png'); %选择图像文件
I=imread([filepath filename]);%读取完整路径的图像
axes(handles.axes1); %指定显示的图像位置
imshow(I); %显示图像矩阵
复制代码
第二步: 执行OCR
在执行OCR操作前可以将图像灰度化,这是为了后面的图像识别步骤能够节约空间,同时也避免在归一化的时候对五张字符都进行灰度化
在OCR操作的时候,使用imcrop函数完成,大家详细资料可以参考mathwork上的介绍;由于铭牌上的字符为5位,故而只需要贴出5个坐标区就行了
global I;
global X1;
global X2;
global X3;
global X4;
global X5;
if size(I,3) ~= 1
I = rgb2gray(I);
end
X1 = imcrop(I);
X2 = imcrop(I);
X3 = imcrop(I);
X4 = imcrop(I);
X5 = imcrop(I);
axes(handles.axes2)
imshow(X1)
axes(handles.axes3)
imshow(X2)
axes(handles.axes4)
imshow(X3)
axes(handles.axes6)
imshow(X4)
axes(handles.axes5)
imshow(X5)
复制代码
第三步:归一化
由于在CNN识别前需要将图像归一化同等大小,而在执行OCR时就已经完成了灰度化操作,此时的图像都是灰度化后的图像,此时借用函数:imresize
这里我没有采用降噪滤波增强,偷懒了,大家在做的时候可以自行加上。
%%
global X1;
global X2;
global X3;
global X4;
global X5;
%%
global X1X;
global X2X;
global X3X;
global X4X;
global X5X;
%%
X1X = imresize(X1,[70,70]); % 都变成70 70的图像
axes(handles.axes2)
imshow(X1X)
%%
X2X = imresize(X2,[70,70]);
axes(handles.axes3)
imshow(X2X)
%%
X3X = imresize(X3,[70,70]);
axes(handles.axes4)
imshow(X3X)
%%
X4X = imresize(X4,[70,70]);
axes(handles.axes5)
imshow(X4X)
%%
X5X = imresize(X5,[70,70]);
axes(handles.axes6)
imshow(X5X)
复制代码
第四步:识别字符
这里我使用了AlexNet网络结构,大家可以参考本人:juejin.cn/post/707478… 这里有详细介绍该网络的结构,同时也可参考:juejin.cn/post/707478… 这里是使用Deep Network Designer的教程
为什么不使用更高级的网络结构:根据奥姆卡剃须刀原理,可以避免过拟合现象出现,同时也实属没必要,浪费算力。
load numdata.mat
global X1X;
global X2X;
global X3X;
global X4X;
global X5X;
Y1 = classify(net,X1X);%预测数据
YPred1=cellstr(Y1);
Y2 = classify(net,X2X);%预测数据
YPred2=cellstr(Y2);
Y3 = classify(net,X3X);%预测数据
YPred3=cellstr(Y3);
Y4 = classify(net,X4X);%预测数据
YPred4=cellstr(Y4);
Y5 = classify(net,X5X);%预测数据
YPred5=cellstr(Y5);
set(handles.edit1,'string',YPred1);
set(handles.edit2,'string',YPred2);
set(handles.edit3,'string',YPred3);
set(handles.edit4,'string',YPred4);
set(handles.edit5,'string',YPred5);
复制代码
初始化
这个步骤就不多叙述了。
clc
axes(handles.axes1);
cla reset
axes(handles.axes2);
cla reset
axes(handles.axes3);
cla reset
axes(handles.axes4);
cla reset
axes(handles.axes5);
cla reset
axes(handles.axes6);
cla reset
A = " ";
set(handles.edit1,'string',A)
set(handles.edit2,'string',A)
set(handles.edit3,'string',A)
set(handles.edit4,'string',A)
set(handles.edit5,'string',A)
复制代码
操作截图:
步骤1:选择图像
步骤2:执行OCR
步骤3:预处理
步骤4:识别字符
扫描二维码关注公众号,回复:
13700354 查看本文章