function [PY2,PY1,PX2,PX1]=jiequ(I)
[y,x,z]=size(I); %行数/列数/RGB层数
myI=double(I); %将I数据转换成双精度型
Y_threshlow=5; %阈值 决定提取的彩图质量
X_firrectify=5; %干扰因子 适当提高可抗干扰,但是小图会照成剪裁太多
% Y 方向
Blue_y=zeros(y,1); %创建y列向量,统计蓝色像素点
for i=1:y
for j=1:x
if((myI(i,j,1)<=48) && ((myI(i,j,2)<=100)&&(myI(i,j,2)>=40)) && ((myI(i,j,3)<=200)&&(myI(i,j,3)>=80)))
%蓝色像素的判断条件:R<=48; 40<=G<=100; 80<=B<=200 R:28 G:63 B:138
Blue_y(i,1)= Blue_y(i,1)+1; %统计每行蓝色像素点数
end
end
end
baisebili=0; %白色比例
changkuanbi=0; %窗口比例(长宽比)
k=0; %表示进入次数
while(~((baisebili>=0.12)&&(baisebili<=0.5)&&(changkuanbi>=0.20)&&(changkuanbi<=0.6)))%初步改善倾斜
if (k==0) %第一次进来
[temp,MaxY]=max(Blue_y);% Y方向车牌区域确定
%temp(最多点数):所有行中,最多的累积像素点
%MaxY(最多点所在行):该行中蓝点最多
if temp<=20 %若蓝色像素小于这个值,不符合
msgbox('车牌定位出错','warning');
pause;
end
PY1=MaxY; %将有最多蓝色像素点的行赋值给PY1
while ((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1)) %寻找图片上边界
PY1=PY1-1; %PY1:存储车牌上边界值
end
PY2=MaxY; %将有最多蓝色像素点的行赋值给PY2
while ((Blue_y(PY2,1)>=Y_threshlow)&&(PY2<y)) %寻找图片下边界
PY2=PY2+1;
end
PY1, PY2
% X 方向
X_threshhigh=(PY2-PY1)/11; %X方向长度,决定了提取的彩图的质量,适当提高可抗干扰,但是小图会照成剪裁太多
Blue_x=zeros(1,x); %创建x行向量,统计蓝色像素点
for j=1:x
for i=PY1:PY2 %由于已经确定Y方向范围,因此在此处只需要处理PY1:PY2阶段
if((myI(i,j,1)<=65)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=40))&&((myI(i,j,3)<=160)&&(myI(i,j,3)>=90)))
%蓝色像素的判断条件:R<=65; 40<=G<=100; 90<=B<=160
% R:28 G:63 B:138
Blue_x(1,j)= Blue_x(1,j)+1; %X方向蓝色象素点统计
end
end
end
[temp,MaxX]=max(Blue_x); %MaxX表示最多点数所在的行
PX1=MaxX-6*(PY2-PY1); %寻找X方向左边界
if PX1<=1
PX1=1;
end
while ((Blue_x(1,PX1)<=X_threshhigh)&&(PX1<x)) %阈值
PX1=PX1+1;
end %确定出X方向车牌起点
PX2=MaxX+6*(PY2-PY1); %寻找X方向右边界
if PX2>=x
PX2=x;
end
while ((Blue_x(1,PX2)<=X_threshhigh)&&(PX2>PX1)) %阈值
PX2=PX2-1;
end %确定出X方向车牌终点
PX1 ,PX2
a=PY2-PY1; %宽度
b=PX2-PX1; %长度
White=0; %存储白色区域色素点
for i=PY1:PY2
for j=PX1:PX2
if (std([myI(i,j,1) myI(i,j,2) myI(i,j,3)],1,2)<=22)&&(myI(i,j,1)>=90)&&(myI(i,j,1)<=255)
White= White+1; %白色像素点统计
end
end
end
baisebili=White/(a*b); %白色像素区域比例
changkuanbi=a/b; %宽高比
k=k+1;
% 蓝色区域不是车牌区域
elseif (k~=0)
Blue_y(PY1:PY2,1)=0;
[temp,MaxY]=max(Blue_y);
if temp<=20
msgbox('车牌定位出错','warning');
pause;
end
PY1=MaxY; %PY1:存储车牌上边界值
while ((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1))%找到图片上边界 %阈值为5
PY1=PY1-1;
end
%PY1:存储车牌上边界值
PY2=MaxY;
while ((Blue_y(PY2,1)>=Y_threshlow)&&(PY2<y))%阈值为5
PY2=PY2+1; %PY2:存储车牌上边界值
end
PY1, PY2
% 2次寻找X方向
X_threshhigh=(PY2-PY1)/15; %决定提取的彩图质量,适当提高可抗干扰,但是小图会照成剪裁太多,ganrao
Blue_x=zeros(1,x); %进一步确定X方向的车牌区域
for j=1:x
for i=PY1:PY2
if((myI(i,j,1)<=45)&&((myI(i,j,2)<=90)&&(myI(i,j,2)>=20))&&((myI(i,j,3)<=160)&&(myI(i,j,3)>=80)))
Blue_x(1,j)= Blue_x(1,j)+1;
end
end
end
%从中间向两边扩展,但车牌中间某些位置可能出现断层
%采用增强型两边往中间收缩
[temp,MaxX]=max(Blue_x);
PX1=MaxX-6*(PY2-PY1);
if PX1<=1
PX1=1;
end
while ((Blue_x(1,PX1)<=X_threshhigh)&&(PX1<x)) %阈值
PX1=PX1+1;
end %确定出X方向车牌起点
PX2=MaxX+6*(PY2-PY1);
if PX2>=x
PX2=x;
end
while ((Blue_x(1,PX2)<=X_threshhigh)&&(PX2>PX1)) %阈值
PX2=PX2-1;
end %确定出X方向车牌终点
PX1 ,PX2
a=PY2-PY1+1;b=PX2-PX1+1;
White=0;
for i=PY1:PY2
for j=PX1:PX2
if (std([myI(i,j,1) myI(i,j,2) myI(i,j,3)],1,2)<=16)&&(myI(i,j,1)>=90)&&(myI(i,j,1)<=255)
White= White+1; % 白色象素点统计
end
end
end
baisebili=White/(a*b);
changkuanbi=a/b;
k=k+1;
end
end
%
Y_firrectify=fix((PY2-PY1)/5); %取整 车牌区域修正系数
PY1=PY1-Y_firrectify; %对车牌区域的修正,向上
PY2=PY2+Y_firrectify; %对车牌区域的修正,向下
PX1=PX1-X_firrectify; %对车牌区域的修正
PX2=PX2+X_firrectify; %对车牌区域的修正
评论0