⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 projcarangle.m

📁 用于进行车牌校正的程序
💻 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 + -