最小二乘我没用过;倾斜校正用得比较多的是hough变换和randon变换;hough变换必须得在车牌二值化的时候出现边框,要是粗定位没有边框或本来车牌边框不明显就没辙了。所以貌似radon变换比较靠谱;也叫旋转投影法,鲁棒性也比较好。
我现在用的是改进的radon变换,以检测投影值的一阶导数累加值为基础。你可以先看看相关论文
下面是我的radon变换子程序,你可以参考一下
function [picbw_xz,angle_xz]=radon(temparea_gray)
%temparea_gray=rgb2gray(temparea);
[height,width]=size(temparea_gray);
level=ostugetT(temparea_gray,height,width);
picbw=im2bw(temparea_gray,level/255.0);
%figure(1);imshow(picbw);
sum_xz=zeros(21,height);
total_xz=zeros(1,21);
max_total=0;
for angle=-5:5
picbw_temp = imrotate(picbw,angle,'crop');
t=angle+11;%%
for i=1:height
sum_xz(t,i)=0;
for j=1:width
sum_xz(t,i)=sum_xz(t,i)+picbw_temp(i,j);
end
end
total_xz(t)=0;
for i=1:height-1
total_xz(t)=total_xz(t)+abs( sum_xz(t,i)-sum_xz(t,i+1) );
end
if total_xz(t)>max_total
angle_xz=angle;
picbw_xz=picbw_temp;
max_total=total_xz;
end
end
字符识别的话用BP神经网络好了,简单。
下面这段是用来训练神经网络的,BP网络的基础知识是必须的啊忍忍多看两遍就理解了。
文件夹下面有1~199张阿拉伯数字的样本图片,循环送到MATLAB中保存32×16×200的特征值,并与输出教师信号t对应,存在num_PT里头。
然后送到matlab的神经网络工具箱里面去训练。(相关资料百度文库里面也有)最后保存网络
% 引自《神经网络模型及其MATLAB仿真程序设计》一书P94~98
% 生成输入向量和目标向量
clear all;
'LOADING......'
for kk = 0:199
m=strcat('use_num\',int2str(kk),'.jpg');%
x=imread(m,'jpg'); %依次输入训练字符。
bw1=im2bw(x,0.5); %用0.5阈值进行二值化
for m=0:15
p(m*32+1:(m+1)*32,kk+1)=bw1(1:32,m+1);
end
switch kk
case
t(:,kk+1)=[0 0 0 0 0 0 0]; % t(kk+1)记录了真实的数值
case
t(:,kk+1)=[0 0 0 0 0 0 1];
case
t(:,kk+1)=[0 0 0 0 0 1 0];
case
t(:,kk+1)=[0 0 0 0 0 1 1];
case
t(:,kk+1)=[0 0 0 0 1 0 0];
case
t(:,kk+1)=[0 0 0 0 1 0 1];
case
t(:,kk+1)=[0 0 0 0 1 1 0];
case
t(:,kk+1)=[0 0 0 0 1 1 1];
case
t(:,kk+1)=[0 0 0 1 0 0 0];
case
t(:,kk+1)=[0 0 0 1 0 0 1];
end
end
'LOAD OK.'
save num_PT p t;
% 创建和训练BP网络
load num_PT p t;
pr(1:512,1)=0;
pr(1:512,2)=1;
net=newff(pr,[30 7],, 'traingdx', 'learngdm');% pr为输入节点 [25 1]隐层数目 为隐层传输函数
net.trainParam.epochs=3000; %最大训练步数 %Backpropagation network training function %%%%Backpropagation weight/bias learning function
%net.trainParam.goal=0.0001; %训练目标误差
net.trainParam.show=10; %显示训练结果的间隔步数
net.trainParam.lr=0.01; %学习速度
net=train(net,p,t)
'TRAIN OK.'
save num_PT net;
保存好的网络num_PT net说白了就是记录权值系数的矩阵,在识别的地方调用这些系数与待识别的特征值相乘;得到的t就是识别结果