最近看了《基於數字圖像處理的車牌識別研究》這篇論文,對車牌識別知識講的很仔細,推薦。
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
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
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)
不過改進空間還是很大,對於藍色車輛、深藍色車輛以及圖片中藍色較多的圖片,識別效果還是不行。