📄 projcarangle.m
字号:
%%工程名称: 基于颜色对的Radon变换车牌角度校正
%%工程步骤: 1. 先以基于颜色对的主成分分析方法确定车牌角度大致范围
%% 2. 利用radon变换来进行倾斜角度精确定位
clc;
clear all;
im_c_cp = imread('cp.jpg');
%%显示原始彩图
figure(1)
imshow(im_c_cp);
title('原始彩图');
[height,width,other] = size(im_c_cp);
% 先寻找蓝白颜色对
im_color = im_c_cp;
for i = 1:height
for j = 1:width
if (j~=width) &...%%当前点为蓝色%%下一个点为白色 或者 当前点为白色下一个点为蓝色
((((im_c_cp(i,j,1)>=15 & im_c_cp(i,j,1)<=50) &...
(im_c_cp(i,j,2)>=25 & im_c_cp(i,j,2)<=50) &...
(im_c_cp(i,j,3)>=65 & im_c_cp(i,j,3)<=140))&...
((im_c_cp(i,j+1,1)>=55 & im_c_cp(i,j+1,1)<=170) &...
(im_c_cp(i,j+1,2)>=65 & im_c_cp(i,j+1,2)<=180) &...
(im_c_cp(i,j+1,3)>=130 & im_c_cp(i,j+1,3)<=220))) |...
(((im_c_cp(i,j,1)>=55 & im_c_cp(i,j,1)<=170) &...
(im_c_cp(i,j,2)>=65 & im_c_cp(i,j,2)<=180) &...
(im_c_cp(i,j,3)>=130 & im_c_cp(i,j,3)<=220))&...
((im_c_cp(i,j+1,1)>=15 & im_c_cp(i,j+1,1)<=50) &...
(im_c_cp(i,j+1,2)>=25 & im_c_cp(i,j+1,2)<=50) &...
(im_c_cp(i,j+1,3)>=65 & im_c_cp(i,j+1,3)<=140))))
im_color(i,j,:) = 0;
im_color(i,j+1,:) = 0;
else im_color(i,j,:) = 255;
end
end
end
%%显示所取得的蓝白特征点及其在图像中的位置
figure(2)
imshow(im_color);
title('取得的蓝白特征点及其在图像中的位置')
%对蓝白颜色点进行主成分分析
a = im_color ; b=[0,0] ; m=1;
for j=1:height%%先行后列寻找所有不为黑色的点,坐标记录到b
for k=1:width
if a(j,k)<3
b(m,1)=j;b(m,2)=k;m=m+1;
end
end
end
d(:,1)=b(:,2);d(:,2)=height+1-b(:,1);%%坐标映射方式变换
%%主成分分析
s=[0,0;0,0;];
my=mean(d(:,2));mx=mean(d(:,1));
y=d(:,2);x=d(:,1);
xmx=x-mx;ymy=y-my;
s(1,1)=sum(xmx.*xmx);s(1,2)=sum(xmx.*ymy);
s(2,1)=sum(xmx.*ymy);s(2,2)=sum(ymy.*ymy);
s;
[v,dd]=eig(s) ;
%%通过主成分分析求得近似角度值
%%由于特征值矩阵在对角线上以从小到大寻序排列,右下角为最大
prox_angle = asin(abs(v(2,2)))*180/(2*pi)
%%通过主分量的贡献率,来判断可能的误差范围
contribute = dd(2,2) / (dd(1,1) + dd(2,2));
if contribute>0.9 & contribute<=1
angle = (prox_angle-1.5):0.1:(prox_angle+1.5);
elseif contribute>0.8 & contribute<=0.9
angle = (prox_angle-3):0.2:(prox_angle+3);
elseif contribute>0.7 & contribute<=0.8
angle = (prox_angle-6):0.3:(prox_angle+6);
else
angle = (pro_angle-10):0.5:(prox_angle);
end
%%显示主成分的贡献率
figure(3);
pie([dd(1,1),dd(2,2)]);
title('主成分的贡献率')
%%进行radon变换来精确计算倾斜角度
im_g_cp = rgb2gray(im_c_cp);
%%对灰度图进行radon变换
[R,Xp] = radon(im_g_cp,angle);
%%利用求导和累加,来得到变化幅度最大的角度
diff_R = diff(R');
abs_diff_R = abs(diff_R);
sum_abs_diff_R = sum(abs_diff_R,2);
%%找出最大值以及其下标
[Max_diff,indices] = max(sum_abs_diff_R);
acc_angle = angle(1,indices+1)
%%绘制出落差幅度变化趋势
figure(4)
stem(sum_abs_diff_R);
title('落差幅度变化趋势')
xlabel('角度')
ylabel('落差幅度')
text(indices,Max_diff,'★')
%%依据计算出来的角度进行图像校正
figure(5)
rotated_im = imrotate(im_c_cp,-acc_angle);
imshow(rotated_im)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -