这里写自定义目录标题
Matlab中(蓝色)车牌定位算法(1)
方案一:
clc
close all
clear all
%%
[uuu,vvv]=uigetfile({'*.jpg;*.tif;*.png;*.gif;*.BMP;*.JPEG','All Image Files'} ,'MultiSelect', 'on');%获取一张车牌照片
path=strcat(vvv,uuu);%拼接图片路径
img_rgb=imread(path); %读取图像
img_rgb=imresize(img_rgb,[240,320]); %设置图像大小
imshow(img_rgb);title('原图'); %显示图像
%%
%-------------------车牌定位--------------------%
%[img_lp]=LPLocation(img_rgb); %调用车牌定位函数
%-------自己写的车牌定位函数---------%
img_gray = rgb2gray(img_rgb);
figure;
subplot(1,2,1);
imshow(img_gray);
title("灰度图像");
subplot(1,2,2)
imhist(img_gray);
title("灰度处理直方图");
%均值滤波
A=fspecial('average',3)
img_gray=filter2(A,img_gray)/255;
figure('name','均值滤波');
imshow(img_gray);
title("灰度图均值滤波")
% 边缘提取
img_edge =edge(img_gray,'sobel',0.1,'vertical');
figure('name','边缘提取');
imshow(img_edge);
title('sobel 算子边缘检测');
%% 检测RGB图像的背景蓝色区域
img_r=img_rgb(:,:,1);
img_g=img_rgb(:,:,2);
img_b=img_rgb(:,:,3);
index= img_r>200&img_g>200;
img_b(index)=0;
index2=img_r<20&img_g<20;
img_b(index2)=0;
%img_r=double(img_r);
%img_g=double(img_g);
[m,n]=size(img_b); %0是黑色,255白色;
figure("name","RGB图像中蓝色区域")
imshow(img_b);
title("RGB图像中蓝色区域");
%二值化
img_bw=im2bw(img_b,0.4);
figure('name','蓝色区域二值化')
imshow(img_bw);
%%
[L,m]=bwlabel(img_bw,8); %二值图联通域
% figure();
% imshow(L);
status = regionprops(L,'BoundingBox'); %测量标注矩阵L中每一个标注区域的一系列属性。
for i=1:m
rect(i,:)=getfield(status(i),'BoundingBox');
end
ratio=rect(:,3)./rect(:,4);
for i=1:m
if(ratio(i)<=2.5)
img_bw(find(L==i))=0;
end
end
figure('name','蓝色区域长宽比')
imshow(img_bw);
%% 腐蚀
se=[1 1];
img_bimr = imerode(img_bw, se);
figure('name','图像腐蚀');
imshow(img_bimr);
title('图像腐蚀后的图像');
%%
%膨胀 %%%buyao
se = strel('rectangle',[1,5]);
img_bimr2 = imdilate(img_bimr, se);
figure('name','膨胀');
imshow(img_bimr2);
title('膨胀');
%% 选出竖向纹理复杂的蓝色区域
img_b_edge=img_bimr2&img_edge; %%%%
img_b_edge=bwareaopen(img_b_edge,5);
figure('name','图像取交');
imshow(img_b_edge);
title('图像取交');
%%
se = strel('rectangle',[10,40]);
img_close = imclose(img_b_edge, se);
figure('name','平滑处理');
imshow(img_close);
title('平滑图像的轮廓');
%%
[L,m]=bwlabel(img_close,8);
status =regionprops(L,'Area');
area = cat(1,status.Area);
index = find(area/max(area)>=0.7); %求最大连通域的索引
img_area = ismember(L,index); %获取最大连通域图像
%img_area = bwareaopen(img_b_imr, 1300);
figure('name', '移除小对象');
imshow(img_area);
title('从图像中移除小对象');
%长宽比提取
[L,m] = bwlabel(img_area,8);
status = regionprops(L,'BoundingBox');
for i=1:m
rect(i,:)=getfield(status(i),'BoundingBox');
end
ratio=rect(:,3)./rect(:,4);
for i=1:m
if(ratio(i)<=2.5)
img_area(find(L==i))=0;
end
end
figure('name', '移除比例');
imshow(img_area);
title('从图像中移除比例不对的区域');
%% 选择车牌文字位置
% 统计图片蓝色区域
% Y方向
[y, x, z] = size(img_area);
img_area_double = double(img_area); % 转成双精度浮点型
blue_Y = zeros(y, 1);
for i = 1:y
for j = 1:x
if(img_area_double(i, j) == 1) % 判断车牌位置区域
blue_Y(i, 1) = blue_Y(i, 1) + 1; % 像素点统计
end
end
end
% 找到Y坐标的最小值
img_Y1 = 1;
while (blue_Y(img_Y1) < 5) && (img_Y1 < y)
img_Y1 = img_Y1 + 1;
end
% 找到Y坐标的最大值
img_Y2 = y;
while (blue_Y(img_Y2) < 5) && (img_Y2 > img_Y1)
img_Y2 = img_Y2 - 1;
end
% x方向
blue_X = zeros(1, x);
for j = 1:x
for i = 1:y
if(img_area_double(i, j) == 1) % 判断车牌位置区域
blue_X(1, j) = blue_X(1, j) + 1;
end
end
end
% 找到x坐标的最小值
img_X1 = 1;
while (blue_X(1, img_X1) < 5) && (img_X1 < x)
img_X1 = img_X1 + 1;
end
% 找到x坐标的最小值
img_X2 = x;
while (blue_X(1, img_X2) < 5) && (img_X2 > img_X1)
img_X2 = img_X2 - 1;
end
% 对图像进行裁剪
img_lp = img_rgb(img_Y1:img_Y2, img_X1:img_X2, :);
figure('name', '定位剪切图像');
imshow(img_lp);
title('定位剪切后的彩色车牌图像')
imwrite(img_lp, './车牌文字/车牌图像.jpg');
save img_lp img_lp