如何从不同角度识别车牌上的字母

How to to identify letters on a license plate with varying perspectives

我正在 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

这里有一些例子:

从这里我不确定如何隔离车牌的字母,特别是在上面的第二个例子中,由于图像的透视,每个字母的面积都减小了。我的第一个想法是获取所有区域的边界框并仅保留周长与面积之比为 "similar" 的区域,但这导致在我像 KV 在上面的第四个例子中。

如果我能就如何隔离这些信件提出一些建议,我将不胜感激。无需代码,欢迎任何建议。

所以我继续工作,尽管在 SO 上没有收到任何答案,并通过反复试验设法获得了一个工作版本。以下所有代码都在我原始问题中的代码之后,下面的所有图都来自上面的第一个示例图像。首先,我找到了图像的每个像素行的方差,并像这样绘制它们:

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

然后我将一个非常高阶的多项式拟合到这个散点图并保存多项式斜率为零且方差值非常低的值(即紧接在一行之前或之后的暗行像素一些白色):

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

然后我计算任何连续 Z 值(我的黑行)之间的多项式的积分,并保存积分最大的两个 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;

由于这些行的 X 值对应于原始图像中的行号,我可以在 MIN_ROWMAX_ROW 之间裁剪图像:

我现在对像素列重复上述步骤,裁剪并删除列中任何多余的黑色行以生成已识别的图版:

然后我使用 Matlab xcorr2 在裁剪后的图像和边缘图像 D 之间执行 2D 互相关,以在原始图像中定位车牌。找到位置后,我只是在发现的盘子周围画了一个矩形,如下所示: