2017-03-15 106 views
0

我正在Matlab中製作一個腳本,用於拍攝汽車尾部的圖像。經過一些圖像處理後,我想輸出汽車原始圖像,並在汽車牌照周圍繪製矩形。以下是我迄今寫:如何以不同視角識別牌照上的字母

origImg = imread('CAR_IMAGE.jpg'); 
I = imresize(origImg, [500, NaN]); % easier viewing and edge connecting 
G = rgb2gray(I); 
M = imgaussfilt(G); % blur to remove some noise 
E = edge(M, 'Canny', 0.4); 

% I can assume all letters are somewhat upright 
RP = regionprops(E, 'PixelIdxList', 'BoundingBox'); 
W = vertcat(RP.BoundingBox); W = W(:,3); % get the widths of the BBs 
H = vertcat(RP.BoundingBox); H = H(:,4); % get the heights of the BBs 
FATTIES = W > H; % find the BBs that are more wide than tall 
RP = RP(FATTIES); 
E(vertcat(RP.PixelIdxList)) = false; % remove more wide than tall regions 

D = imdilate(E, strel('disk', 1)); % dilate for easier viewing 

figure(); 
imshowpair(I, D, 'montage'); % display original image and processed image 

下面是一些例子:

Plate Detection 1

Plate Detection 2

Plate Detection 3

Plate Detection 4

從他我不確定如何隔離車牌字母,特別是在上面的第二個示例中,由於圖像的角度,每個字母的面積都減小了。我的第一個想法是獲得所有區域的邊界框,並只保留周長與面積比例「相似」的區域,但這會導致刪除當我擴大圖像時連接的板的字母,如KV在上面的第四個例子中。

我將不勝感激關於如何去隔離這些字母的一些建議。沒有代碼是必要的,任何建議表示讚賞。

回答

0

所以我繼續工作,儘管沒有在這裏收到任何答案,並設法通過試驗和錯誤獲得工作版本。以下所有代碼都出現在我原始問題中的代碼之後,下面的所有圖都來自上面的第一個示例圖像。首先,我發現圖像的每一個像素行的變化並繪製它們像這樣:

V = var(D, 0, 2); 
X = 1:length(V); 
figure(); 
hold on;  
scatter(X, V); 

Row Variances

然後我適合一個非常高階多項式來此散點圖和保存價值,其中多項式的斜率爲零並且方差值非常低(即,像素的暗行之前或與一些白色的後一排):

P = polyfit(X', V, 25); 
PV = polyval(P, X); 
Z = X(find(PV < 0.03 & abs(gradient(PV)) < 0.0001)); 
plot(X, PV); % red curve on plot 
scatter(Z, zeros(1,length(Z))); % orange circles on x-axis 

Row Variances Poly

我再計算出多項式的積分任何連續Z值(我暗行)之間,並保存2個Z值之間的積分是最大的,這是我對劇情的線條標示:

MAX_INTEG = -1; 
MIN_ROW = -1; 
MAX_ROW = -1; 
for i = 1:(length(Z)-1) 
    TEMP_MIN = Z(i); 
    TEMP_MAX = Z(i+1); 
    Q = polyint(P); 
    TEMP_INTEG = diff(polyval(Q, [TEMP_MIN, TEMP_MAX])); 

    if (TEMP_INTEG > MAX_INTEG) 
     MAX_INTEG = TEMP_INTEG; 
     MIN_ROW = TEMP_MIN; 
     MAX_ROW = TEMP_MAX; 
    end 
end 
line([MIN_ROW, MIN_ROW], [-0.1, max(V)+0.1]); 
line([MAX_ROW, MAX_ROW], [-0.1, max(V)+0.1]); 
hold off; 

Row Variances Bounds

由於這些線的X值對應的行號在原始圖像中,我可以裁剪MIN_ROWMAX_ROW之間我的圖像:

Row Crop

我現在重複上述步驟爲像素列,作物,以及刪除列的任何過量的黑色的行以產生所確定的板:

Both Crop

我然後執行2D互相關之間的這種即時裁剪年齡和邊緣圖像D使用Matlab的xcorr2在原始圖像中定位板。找到位置後,我只是在發現的盤子周圍繪製一個矩形,如下所示:

Final Rectangle