close all;
clear all;
clc;
img=imread('che.jpg');
img_1=img(:,:,1);
img_2=img(:,:,2);
img_3=img(:,:,3);
%首先确定车牌的位置,车牌是蓝色分量,利用蓝色分量减去红色分量,可以突出蓝色分量
img3_1=abs(img_3-img_1);
% figure;imshow(img3_1);
%%蓝色分量地方的值明显比其他地方大,设定阈值选中蓝色区域
thresh_b=30;
img_bw=im2bw(img3_1,thresh_b/255);
% figure;imshow(img_bw);
%其他地方可能存在干扰,所以去除干扰地方,只取面积最大的地方
img_l=bwlabel(img_bw);%标记连通区域
img_re=regionprops(img_l,'area');%求连通区域的面积
img_area=[img_re.Area];%转为矩阵
area_max=max(img_area);%取面积最大值
img_p=bwareaopen(img_bw,area_max);%将面积较小的地方删除
% figure;imshow(img_p);
%%%求车牌的坐标
[m,n]=size(img_p);
sum_col=sum(img_p,1);%对列求和
sum_row=sum(img_p,2);%对行求和
%找到该连通区域的左边的坐标
for i=1:1:n
if(sum_col(1,i)~=0)
col_left=i;
break;
end
end
%找到该连通区域的右边的坐标
for i=n:-1:1
if(sum_col(1,i)~=0)
col_right=i;
break;
end
end
%找到该连通区域的上边的坐标
for i=1:1:m
if(sum_row(i,1)~=0)
row_up=i;
break;
end
end
%找到该连通区域的下边的坐标
for i=m:-1:1
if(sum_row(i,1)~=0)
row_down=i;
break;
end
end
w=abs(col_right-col_left);%求矩形区域的长度
h=abs(row_down-row_up);%求举行区域的高度
% figure;imshow(img);hold on;
% h1=line([col_left col_right],[row_up,row_up],'Color',[1 0 0],'LineWidth',3);
% h2=line([col_left col_right],[row_down,row_down],'Color',[1 0 0],'LineWidth',3);
% h3=line([col_left col_left],[row_up,row_down],'Color',[1 0 0],'LineWidth',3);
% h4=line([col_right col_right],[row_up,row_down],'Color',[1 0 0],'LineWidth',3);
% hold off;
%%确定了车牌区域,在利用车牌和车子的大致关系确定整个车身
% 车牌大小440×140
% 普通轿车长度都在3800mm到4300mm之间、宽度在1600mm到1800mm之间、高度在1400mm到1600mm之间。
%利用车牌确定车的位置
%车牌到1600/440=3.6,1400/140=10;对于左右两边来说车牌在中间,因此暂定将车牌左坐标减去2个车牌长度得到车身左边,右边加两个长度得到右边
%对于上下来说,车牌不在中间,将其按上7下3的比例分配,即车牌上坐标加上7个坐标宽度得到车身上面左边,车牌下坐标减去3个长度得到下坐标
ser_1=2;%左右
ser_2=7;%上
ser_3=3;%下
c_l=col_left-ser_1*w;c_r=col_right+ser_1*w;
r_u=row_up-ser_2*h;r_d=row_down+ser_3*h;
rect_=[c_l r_u c_r-c_l r_d-r_u];
figure;imshow(img);hold on;
rectangle('Position',rect_,'LineWidth',3,'EdgeColor','r');hold off;
06-15
2万+