二值图像中的去偏斜字符

De-skew characters in binary image

我正在研究车牌识别。问题是我必须对二值图像中的字符进行校正以提高模板匹配的准确性。

我做了很多预处理来去除图像中不需要的像素,我可以将字符分割出来。但不幸的是,它们是有偏差的。

从...转换为灰度到二进制

然后..预处理技术..

分段后..

从最后一张图片可以看出,字符是倾斜的,这将导致模板匹配执行识别目的不准确。

大多数研究人员都使用霍夫变换来执行去偏斜操作,但是有没有更简单的方法来做到这一点?

有很多方法可以解决这个问题。一些在匹配部分避免 unskew 操作本身是这样的:

  • OCR and character similarity

但是你想取消歪斜所以:

  1. 检测旋转angle/skew斜率

    获取边界框,然后投射垂直扫描线,并记住所有边界框的第一个命中点和最后一个回归线

  2. rotate/skew 回来了

    所以要么用atan2求角度,要么直接根据基向量(一是直线,二是垂直向量)构造二维齐次3x3变换矩阵。有关详细信息,请参阅:

  3. 现在 rotated/unskew 图像仍然会以低得多的速率倾斜芽

    所以你也可以在水平轴上应用 #1,#2 但这次你只需要 unskew (不要使用旋转)。通常剩余偏斜率很小,所以不需要这一步。

[备注]

您可以通过过滤掉错误的点或仔细选择扫描线的起点使它们命中字符的正确位置来提高精度(您显然知道字符数)。

[edit1] 小例子

这里是你的图像输出的小例子(负面的,因为我的函数需要白纸和黑色字体):

如您所见,旋转和倾斜要小得多。

您还可以通过 principal component analysis 由图像中所有白色像素组成的一组点来找到倾斜的黑白数据的旋转角度。

代码如下:

% load image
img = imread('skewed.png');
img = img(:, :, 1);
img = double(img);

% perform pca on cloud of white points
[r, c] = find(img);
coeff = pca([r,c]);
angle = atan2(coeff(1,1), coeff(1,2));

% rotate back
img = imrotate(img, angle / pi * 180);
imwrite(img > 0, 'deskewed.png');

输入:

输出(旋转角度~10.3度):