二值图像中的字符去斜矫正

5
我正在进行车牌识别的工作。问题在于我必须对二进制图像中的字符进行去斜处理,以提高模板匹配的准确性。
我已经进行了许多预处理来删除图像中不必要的像素,并且我可以将字符分割出来。但不幸的是,它们是倾斜的。
从灰度转换到二进制...
然后是预处理技术...
分割后...
正如最后一张图片所示,字符是倾斜的,这会导致模板匹配执行识别目的时的不准确性。
大多数研究人员使用Hough变换来执行去斜操作,但是否有更简单的方法来做到这一点?
2个回答

4
有方法可以解决这个问题。有一些关于匹配部分的方法,以避免像这样的旋转倾斜操作:

但是你想要旋转倾斜

  1. 检测旋转角度/倾斜坡度

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

    algo overview

  2. 通过它进行旋转/倾斜

    所以要么使用 atan2 来获得角度,要么直接基于基向量(一个是线,另一个是其垂直向量)构造二维齐次3x3变换矩阵。更多信息请参见:

  3. 现在旋转/倾斜图像仍然会有倾斜,但比率要低得多

    所以你可以在水平轴上也应用#1,#2,但这次你只需要解除倾斜(不使用旋转)。通常残留的倾斜比例很小,所以这一步是不必要的。

[注]

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

[编辑1] 小例子

这里有一个关于你的图像输出的小例子(我的函数期望白纸黑字):

example

正如你所看到的,旋转和倾斜要小得多。


旋转图像和去除倾斜不是不同的吗?@Spektre - Wong Wengkeong
@WongWengkeong 是的,deskew会沿着单个轴移动点,旋转会改变x和y两个轴。 - Spektre
所以,如果我要使用imrotate函数,是否会解决字符的倾斜问题,如果我从您的解决方案中得到正确的角度?@Spektre - Wong Wengkeong
@WongWengkeong 这取决于图像是否因汽车和相机视场之间的旋转而引起扭曲,如果是这样(但您需要恢复所有旋转而不仅仅是xy平面中的一个),如果是由其他原因引起的,例如在行驶过程中拍摄照片(每个图像线在不同时间扫描,因此移动速度会导致其偏移),则只能部分恢复。无论如何,如果您恢复了最大的旋转/倾斜,则其余部分应该只略微扭曲,因此在大多数情况下,您可以忽略它(除非通过直接比较像素来比较字符)。 - Spektre
非常感谢您的解决方案。目前,我已经开发了您的解决方案,现在我有4个坐标点(2条直线方程).. 我正在尝试获取它的theta值。我正在尝试使用atan2,但似乎无法得到准确的角度。您介意向我展示如何做吗?顺便说一句,很抱歉问了这么多问题。@Spektre - Wong Wengkeong
@WongWengkeong 1. 可视化绘制您找到的点以查看它们是否正确。2. atan2 是可以的,但我仍然使用 atanxy,只需确保您的角度是以弧度还是度为单位,并且如果您提供了正确的操作数顺序。3. 您可以在二维中使用 线性回归/拟合 或直接从点对计算线斜率并选择最常见的斜率(这应该可以消除错误的点)。 - Spektre

1
你可以通过对图像中所有白色像素组成的点集进行主成分分析,来找到你的倾斜黑白数据的旋转角度。
以下是代码:
% 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');

输入:

enter image description here

输出(旋转角度约为10.3度):

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接