我正在进行车牌识别。问题是我必须对二进制图像中的字符进行去偏斜以提高模板匹配的准确性。
我已经做了很多预处理来删除图像中不必要的像素,我可以将字符分割出来。但不幸的是,它们是扭曲的。
从...转换为灰度到二进制
然后..预处理技术..
分割后..
正如在上一张图片中可以看到的那样,字符是倾斜的,这将导致模板匹配不准确以执行识别目的。
大多数研究人员正在使用Hough变换来执行去偏移操作,但有更简单的方法吗?
答案 0 :(得分:4)
有办法解决这个问题。一些匹配部分,以避免未扭曲操作本身如下:
但你想要不干预所以:
检测旋转角度/倾斜斜率
获取边界框,然后投射垂直扫描线并记住第一个生命点和最后一个回归线通过所有这些
通过它旋转/歪斜
因此要么使用atan2
来获得角度,要么基于基矢量直接构造2D均匀3x3变换矩阵(一个是线,第二个是它的垂直矢量)。有关详细信息,请参阅:
现在旋转/不倾斜的图像仍会以低得多的速度扭曲芽
所以你也可以在水平轴上应用#1,#2 ,但这次你只需要 unskew (不要使用旋转)。通常残余歪斜比率很小,因此不需要这一步。
<强> [注释] 强>
您可以通过过滤掉错误的点或仔细选择扫描线的起点来提高精度,使它们碰到正确的字符位置(您显然知道字符计数)。
[edit1]小例子
这里有一个小图片输出示例(负面,因为我的功能是期待白纸和黑色字体):
正如您所看到的,旋转和倾斜要小得多。
答案 1 :(得分:1)
您还可以通过图像中所有白色像素组成的一组点的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度):