最近看了《基于数字图像处理的车牌识别研究》这篇论文,对车牌识别知识讲的很仔细,推荐。
1.(摘自《基于数字图像处理的车牌识别研究》)
通过对大量车牌图像的分析,可以发现对于具有某种目标色的像素,可以直接通过对H、s、v三分量设定一个范围来把它们过滤出来,无需进行较复杂的色彩距离计算, 这样可以在色彩分割时节省大量的时间。这种过滤对蓝色和黄色车牌特别有效,但对于黑色和白色的过滤效果不是很理想。这是因为对于纯色的黑色和白色,它们的色调和饱和度没有意义,所以和其它颜色相比缺少了两个过虑指标。
根据这篇论文所讲的步骤想要写程序,开始居然是无从下手。通过参考各种车牌识别matlab程序,才写出来第一个程序。此程序是针对蓝色车牌的识别,识别效果还不错,通过HSV颜色空间分割确实可行。
通过先验知识,汽车车牌的HSV值可由下表确定:
2.蓝色车牌HSV彩色分割定位Matlab程序:
clear all;clc; [Im,Path]=uigetfile('*jpg','选择图片'); Image=imread([Path,Im]); Image=im2double(Image); s=size(Image,2) I=rgb2hsv(Image); [y,x,z]=size(I); Blue_y = zeros(y, 1); p=[0.56 0.71 0.4 1 0.3 1 0]; for i = 1 : y for j = 1 : x hij = I(i, j, 1); sij = I(i, j, 2); vij = I(i, j, 3); if (hij>=p(1) && hij<=p(2)) &&( sij >=p(3)&& sij<=p(4))&&... (vij>=p(5)&&vij<=p(6)) Blue_y(i, 1) = Blue_y(i, 1) + 1; end end end [~, MaxY] = max(Blue_y); Th = p(7); PY1 = MaxY; while ((Blue_y(PY1,1)>Th) && (PY1>0)) PY1 = PY1 - 1; end PY2 = MaxY; while ((Blue_y(PY2,1)>Th) && (PY2<y)) PY2 = PY2 + 1; end PY1 = PY1 - 2; PY2 = PY2 + 2; if PY1 < 1 PY1 = 1; end if PY2 > y PY2 = y; end It=Image(PY1:PY2,:,:); subplot(231),imshow(It); IY = I(PY1:PY2, :, :); subplot(232),imshow(IY); I2=im2bw(IY,0.5); subplot(233),imshow(I2); [y1,x1,z1]=size(IY); Blue_x=zeros(1,x1); for j = 1 : x1 for i = 1 : y1 hij = IY(i, j, 1); sij = IY(i, j, 2); vij = IY(i, j, 3); if (hij>=p(1) && hij<=p(2)) &&( sij >=p(3)&& sij<=p(4))&&... (vij>=p(5)&&vij<=p(6)) Blue_x(1, j) = Blue_x(1, j) + 1; % bw1(i, j) = 1; end end end PY1,PY2 [~, MaxX] = max(Blue_x); Th = p(7); PX1 = MaxX; while ((Blue_x(1,PX1)>Th) && (PX1>0)) PX1 = PX1 - 1; end PX2 = MaxX; while ((Blue_x(1,PX2)>Th) && (PX2<x1)) PX2 = PX2 + 1; end Ita=Image(PY1:PY2,PX1:PX2,:); subplot(234),imshow(Ita); IX = I(PY1:PY2, PX1:PX2, :); subplot(235),imshow(IX); I3=im2bw(IX,0.5); subplot(236),imshow(I3);3.效果展示
(1)
(2)
(3)
不过改进空间还是很大,对于蓝色车辆、深蓝色车辆以及图片中蓝色较多的图片,识别效果还是不行。