2017-03-15 34 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