----------------------------------------------------------------------------------------------

matlab车牌倾斜校正的问题

2010-09-05 15:32

为了这个车牌的倾斜校正搞了很久,自己又不是看得很明白这些算法,只好在网上找了一些。不过发现效果都不甚好。

1.
% 旋转
rotate=0;
bw=edge(I);
[m,n]=size(I);
theta=0:179;
% bw 表示需要变换的图像,theta 表示变换的角度
% 返回值 r 表示的列中包含了对应于 theta中每一个角度的 Radon 变换结果
% 向量 xp 包含相应的沿 x轴的坐标
[r,xp]=radon(bw,theta);
i=find(r>0);
[foo,ind]=sort(-r(i));
k=i(ind(1:size(i)));
[y,x]=ind2sub(size(r),k);
[mm,nn]=size(x);
if mm~=0 && nn~=0
j=1;
while mm~=1 && j<180 && nn~=0
i=find(r>j);
[foo,ind]=sort(-r(i));
k=i(ind(1:size(i)));
[y,x]=ind2sub(size(r),k);
[mm,nn]=size(x);
j=j+1;
end
if nn~=0
if x~=0 % Enpty matrix: 0-by-1 when x is an enpty array.
x=x;
end
if x==0   % 可能 x 为空值
x=90; % 其实就是不旋转
end
d=imrotate(d,abs(90-x)); % 旋转图像
rotate=1;
end
end
这个本来是可以用的,不过后来虽然没有改过,却不行了。有些图是只需旋转几度的,却旋转了差不多90度(x总是等于一)。主要是中间一段的内容我看不懂,希望各位朋友给小弟讲解讲解^_^
2.
%利用最小二乘法进行图像倾斜校正
clear all
I=imread('c:\aaa2.jpg');
figure(1),imshow(I);
A=0;       %最小二乘法求解中的第1项
B=0;       %最小二乘法求解中的第2项
C=0;       %最小二乘法求解中的第3项
D=0;       %最小二乘法求解中分母的第1项
N=0;       %计算图像中为1的个数
I1=im2bw(I,0.3); %对输入图像进行二值化处理
[m,n]=size(I1);
II=ones(m,n);
II=-1*I1+II;     %反色处理
[m,n]=find(II);
rowmin=min(m);
rowmax=max(m);
colummin=min(n);
colummax=max(n);
I2=II(rowmin:rowmax,colummin:colummax); %显示文字部分
[m,n]=size(I2);
for i=1:m
for j=1:n
A=A+I2(i,j)*i*j;
B=B+I2(i,j)*i;
C=C+I2(i,j)*j;
D=D+I2(i,j)*j*j;
N=I2(i,j)+N;     %计算最小二乘法中的各项
end
end
U=N*A-C*B;
V=N*D-C*C;
a=U/V;                %计算啮合直线的斜率
rotate=atan(a);
rotate=rotate*180/3.142;
J=imrotate(I,rotate);   %对图像进行旋转
figure(10),imshow(J);    %显示经过校正的图像

这个是用最小二乘法来做的,也是网上找回来的。不过发现每次旋转的角度很小,没感觉有旋转到位。

——————————————————————————————————————

第一个程序,我不知如何将倾斜校正后的程序输出。

第二个程序,貌似要将倾斜校正前的图片去除边框,铆钉等,处理效果才好。但无奈我又不知如何去除边框和铆钉。