求车牌识别中的倾斜矫正程序 MATLAB

本人现在在做车牌识别的算法,感觉有两个关键环节总是解决不好,一个就是倾斜矫正,倾斜角不是计算的很准确,所以总是歪的,本人试过最小二乘法,对有些有用,对有些就不行,在网上下了很多用hough算法计算倾斜角,原理好象是检测到车牌上下两个边界,因为他们是平行的,所以很好检测,然后在对应水平线得出倾斜角,但我好象不太明白它是怎么检测的,相应的程序也没编出来.另外一个是字符识别,我用的是模板匹配,对干扰信号特别敏感,所以精确度不高.望有这方面的志士仁人能开导小弟一番,小弟不胜感谢,答案采纳了肯定会加80分(当然我知道您肯定不在乎这点财富积分,只是我表示的感谢形式而已)再三感谢,无以言表...
能不能再给个BP神经网络的程序啊,我也曾研究过相关的论文,可惜我不会编....不胜感激,我已经把分值提高50,希望您笑纳

最小二乘我没用过;倾斜校正用得比较多的是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{0,1,2,3,4,5,6,7,8,9,100,101,102,103,104,105,106,107,108,109}
t(:,kk+1)=[0 0 0 0 0 0 0]; % t(kk+1)记录了真实的数值
case{10,11,12,13,14,15,16,17,18,19,110,111,112,113,114,115,116,117,118,119}
t(:,kk+1)=[0 0 0 0 0 0 1];
case{20,21,22,23,24,25,26,27,28,29,120,121,122,123,124,125,126,127,128,129}
t(:,kk+1)=[0 0 0 0 0 1 0];
case{30,31,32,33,34,35,36,37,38,39,130,131,132,133,134,135,136,137,138,139}
t(:,kk+1)=[0 0 0 0 0 1 1];
case{40,41,42,43,44,45,46,47,48,49,140,141,142,143,144,145,146,147,148,149}
t(:,kk+1)=[0 0 0 0 1 0 0];
case{50,51,52,53,54,55,56,57,58,59,150,151,152,153,154,155,156,157,158,159}
t(:,kk+1)=[0 0 0 0 1 0 1];
case{60,61,62,63,64,65,66,67,68,69,160,161,162,163,164,165,166,167,168,169}
t(:,kk+1)=[0 0 0 0 1 1 0];
case{70,71,72,73,74,75,76,77,78,79,170,171,172,173,174,175,176,177,178,179}
t(:,kk+1)=[0 0 0 0 1 1 1];
case{80,81,82,83,84,85,86,87,88,89,180,181,182,183,184,185,186,187,188,189}
t(:,kk+1)=[0 0 0 1 0 0 0];
case{90,91,92,93,94,95,96,97,98,99,190,191,192,193,194,195,196,197,198,199}
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],{'logsig' 'logsig'}, '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就是识别结果
温馨提示:答案为网友推荐,仅供参考