汽车牌照图像倾角矫正方法研究
首先我们对汽车牌照图像进行边缘检测,找出图像与背景的交线,然后就可以通过一定算法确定图像的倾斜角度了。这里采用了Sobel水平方向算子对图像中的水平边缘直线进行检测[2]。
检测出图像中的直线后,我们要对其倾角进行计算,这里选用了Hough变换法、Radon变换法、最小二乘法和两点法四种方法来计算直线的倾角,下面将具体研究这四种方法并对其优缺点做出比较。
1 Hough变换法
利用Hough变换法提取直线是一种变换域提取直线的方法,它把直线上的坐标变换到过点的直线的系数域,巧妙的利用了共线和直线相交的关系。
它的原理很简单:假设有一条与原点距离为s,方向角为θ的一条直线,如图3.1所示:
图1 一条与原点距离为s,方向角为θ的直线
直线上的每一点都满足方程:
s?ysin? (3.1) s?xco? 证明过程如下:
图2 坐标变换原理图
如图3.2所示:
oc?obco?s?xcos? nc?nbsin??ysin? 所以 :
s?oc?nc?xco?s?ysin? m为直线l上任意一点
nd?y?y1,md??(x?x1) 因为:
df?ndsin??(y?y1)sin? df?mdco?s??(x?x1)co?s 所以:
ysin??y1sin???xco?s?x1co?s 所以:
s?xco?s?ysin??x1co?s?y1sin? 所以直线上任意一点都满足
s?xco?s?ysin? (3.2)(3.3)3.4)(3.5)
(3.6)(3.7)(3.8)3.9)3.10)
(
(
(
图3 x-y平面一点可以对应多个 s,θ值
由图3.3可以看出点(x1,y1)即属于直线L1又属于直线L2,且满足:
s1?x1cos?1?y1sin?1 (3.11) s2?x1cos?2?y1sin?2 (3.12)
所以,x-o-y平面上的一点(x1,y1)对应于s-o-θ平面上的一条曲线。
由于一条直线上的点都满足s?xcos??ysin?,所以x-o-y平面上处在一条直线上的点经过变换在S-O-θ平面上所得的曲线相交于一点。如下图所示:
图4 Hough变换前后对比图
因此可以把x-o-y平面内直线的问题转化为S-O-θ平面内点的问题[3]。
用Hough变换检测汽车牌照图像中直线的具体步骤为:
(1)对图像进行边缘检测,这里选用了Sobel算子检测图像中水平方向的直线。
图5 网格图
(2)假设图像对应于x-o-y空间,定义一个S-o-θ(θ角的范围为1-180)空间,对图像中象素为1的每一个点进行计算(应用公式(3.10)),做出每一个象素为1的点的曲线,同时把S-θ平面分成等间隔(1×1)的小网格,这个小网格对应一个记数矩阵。如图3.5所示,凡是曲线所经过的网格,对应的记数矩阵元素值加1,所以对原图像中的每一点进行计算以后记数矩阵元素的值等于共线的点数。我们可以认为记数矩阵中元素的最大值对应原始图像中最长的直线。
(3)检测出记数矩阵的最大的元素所对应的列坐标θ,θ即为这条直线的法线与X轴的夹角。因此我们可以通过θ角来确定直线的倾斜角度,进而对图像进行矫正。
图6 倾角矫正前图像
Hough变换法矫正图像程序实现如下:
bw=edge(l,'sobel','horizontal');%检测图像边缘直线 [m,n]=size(bw);%计算图像大小
S=round(sqrt(m^2+n^2));%S可以取到的最大值
ma=180;%θ角最大值
r=zeros(md,ma);%产生初值为零的计数矩阵 for i=1:m for j=1:n if bw(i,j)==1 for k=1:ma
ru=round(abs(i*cos(k*3.14/180)+j*sin(k*3.14/180))); r(ru+1,k)=r(ru+1,k)+1;%对矩阵记数 end end end end
[m,n]=size(r); for i=1:m for j=1:n if r(i,j)>r(1,1) r(1,1)=r(i,j);
c=j;%把矩阵元素最大值所对应的列坐标送给c。 end end end if c<=90
rot=-c; %确定旋转角度 else
rot=180-c; end
pic=imrotate(l,rot,'crop'); %对图片进行旋转,矫正图像
下面给出了Hough变换法对倾斜图像进行矫正后的图像: