Matlab影像處理——藍色車牌的提取 (qq.com)
在現代社會中,車牌辨識已經成為交通管理和安全監控中一個重要的工具。車牌提取是車牌辨識中的一個關鍵步驟,透過提取車牌可以去除非車牌區域帶來的幹擾,從而更加快速準確的辨識車牌。這篇文章將介紹如何使用Matlab來提取藍色車牌。
1. 車牌顏色提取原理車牌區域具有明顯的特點,因此根據車牌底色、字色等有關知識,可采用彩色像素點統計的方法分割出合理的車牌區域。本案例以藍底白字的普通車牌為例說明彩色像素點統計的分割方法,假設經網路攝影機拍攝采集得到了包含車牌的 RGB 彩色影像,水平方向記為y,垂直方向記為x。首先,確定車牌底色 RGB 各分量分別對應的顏色範圍;其次,在y方向統計此顏色範圍內的像素點數量,設定合理的閾值,確定車牌在 y方向的合理區域。然後,在分割出的y方向區域內統計X方向此顏色範圍內的像素點數量,設定合理的閾值進行定位。最後,根據x、y方向的範圍來確定車牌區域,實作定位。2. Matlab程式碼實作
clear
clc
I = imread('1.jpg');
%% 根據影像寬度設定處理參數,對應藍色區域
if size(I, 2) > 900
parm = [0.35 0.9 90 0.35 0.7 90 2];
end
if size(I, 2) > 700 && size(I, 2) < 900
parm = [0.6 0.9 90 0.6 0.8 90 0.5];
end
if size(I, 2) > 500 && size(I, 2) < 700
parm = [0.5 0.54 50 0.6 0.7 50 3];
end
if size(I, 2) < 500
parm = [0.8 0.9 150 0.8 0.9 150 3];
end
%% 行(Y)過濾結果
[y, x, z] = size(I); %讀取yxz三個方向的深度
myI = double(I);
Blue_y = zeros(y, 1);
%for迴圈對滿足條件的像素點的行對應的個數進行統計
for i = 1 : y
for j = 1 : x
rij = myI(i, j, 1)/(myI(i, j, 3)+eps);
gij = myI(i, j, 2)/(myI(i, j, 3)+eps);
bij = myI(i, j, 3);
%藍色RGB的灰度範圍
if (rij < parm(1) && gij < parm(2) && bij > parm(3)) ...
|| (gij < parm(1) && rij < parm(2) && bij > parm(3))
Blue_y(i, 1) = Blue_y(i, 1) + 1; %藍色像素點統計
end
end
end
%Y方向車牌區域確定
[~, MaxY] = max(Blue_y);
Th = parm(7);
%向上追溯,直到車牌區域上邊界
PY1 = MaxY;
while ((Blue_y(PY1,1)>Th) && (PY1>1))
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
IY = I(PY1:PY2, :, :); %車牌區域
figure
imshow(IY); title('行過濾結果', 'FontWeight', 'Bold');
%% 列(X)過濾結果
Blue_x = zeros(1,x);
for j = 1:x
for i = PY1:PY2
rij = myI(i, j, 1)/(myI(i, j, 3)+eps);
gij = myI(i, j, 2)/(myI(i, j, 3)+eps);
bij = myI(i, j, 3);
%藍色RGB的灰度範圍
if (rij < parm(4) && gij < parm(5) && bij > parm(6)) ...
|| (gij < parm(4) && rij < parm(5) && bij > parm(6))
Blue_x(1,j) = Blue_x(1,j) + 1;
end
end
end
%向右追溯,直到車牌區域左邊界
PX1 = 1;
while (Blue_x(1,PX1)<Th) && (PX1<x)
PX1 = PX1 + 1;
end
%向左追溯,直到車牌區域右邊界
PX2 = x;
while (Blue_x(1,PX2)<Th) && (PX2>PX1)
PX2 = PX2 - 1;
end
%對車牌區域進行修正
PX1 = PX1 - 2;
PX2 = PX2 + 2;
if PX1 < 1
PX1 = 1;
end
if PX2 > x
PX2 = x;
end
%得到車牌區域
IX = I(:, PX1:PX2, :);
figure
imshow(IX); title('列過濾結果', 'FontWeight', 'Bold');
%%
Plate = I(PY1:PY2, PX1:PX2, :);
Loc.row = [PY1 PY2];
Loc.col = [PX1 PX2];
%%
figure;
imshow(I); title('原影像', 'FontWeight', 'Bold');
hold on;
row = Loc.row;
col = Loc.col;
plot([col(1) col(2)], [row(1) row(1)], 'r-', 'LineWidth', 3);
plot([col(1) col(2)], [row(2) row(2)], 'r-', 'LineWidth', 3);
plot([col(1) col(1)], [row(1) row(2)], 'r-', 'LineWidth', 3);
plot([col(2) col(2)], [row(1) row(2)], 'r-', 'LineWidth', 3);
hold off;
figure
imshow(Plate); title('分割結果', 'FontWeight', 'Bold');
3、執行結果
4. 總結
本文介紹了如何使用Matlab來提取藍色車牌。透過設定閾值,我們可以快速、簡單地實作車牌顏色的提取。這對於車牌辨識等套用具有重要意義。需要註意的是,在實際套用中,由於光照、車速等因素的幹擾,車牌的影像可能存在一定的形變、旋轉等問題,因此需要進行影像校正和處理,以保證分割的準確性和穩定性。關於影像校正可參考下面的文章:Matlab影像處理——文件影像傾斜角檢測及校正
小英熊學長會非週期性釋出相關設計內容包括但不限於如下內容:訊號處理、通訊仿真、演算法設計、matlab appdesigner,gui設計、simulink仿真......希望能幫到你!有任何matlab和python相關的問題都可以在後台滴滴小英熊學長歐~