在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:识别字符