汽车牌照图像倾角矫正方法研究首先我们对汽车牌照图像进行边缘检测,找出图像与背景的交线,然后就可以通过一定算法确定图像的倾斜角度了。
这里采用了Sobel水平方向算子对图像中的水平边缘直线进行检测[2]。
检测出图像中的直线后,我们要对其倾角进行计算,这里选用了Hough变换法、Radon变换法、最小二乘法和两点法四种方法来计算直线的倾角,下面将具体研究这四种方法并对其优缺点做出比较。
1 Hough变换法利用Hough变换法提取直线是一种变换域提取直线的方法,它把直线上的坐标变换到过点的直线的系数域,巧妙的利用了共线和直线相交的关系。
它的原理很简单:假设有一条与原点距离为s,方向角为θ的一条直线,如图3.1所示:图1 一条与原点距离为s,方向角为θ的直线直线上的每一点都满足方程:θsinθ=(3.1)s+xcos y证明过程如下:图2 坐标变换原理图如图3.2所示:θcosθ=(3.2)oc=obcos xθsinθ=(3.3)nc=nbsin y所以:θθsin=s++=(3.4)cos yxncocm为直线l上任意一点nd--y-=(3.5)=()1y,1xxmd因为:θsinθdf-==(3.6)ndy)1(sin yθcosθ-==(3.7)df-md(cos xx)1所以:θθcosθθyy+x=--(3.8)sin x1cossin1所以:θsinθθθxs+==(3.9)+ycos y1cos1sinx所以直线上任意一点都满足θθsin=(3.10)s+cos yx图3 x-y 平面一点可以对应多个 s,θ值由图3.3可以看出点(x1,y1)即属于直线L1又属于直线L2,且满足:1sin 11cos 11θθy x s += (3.11) 2sin 12cos 12θθy x s += (3.12)所以,x-o-y 平面上的一点(x1,y1)对应于s-o-θ平面上的一条曲线。
由于一条直线上的点都满足θθsin cos y x s +=,所以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:mfor j=1:nif bw(i,j)==1for k=1:maru=round(abs(i*cos(k*3.14/180)+j*sin(k*3.14/180)));r(ru+1,k)=r(ru+1,k)+1;%对矩阵记数endendendend[m,n]=size(r);for i=1:mfor j=1:nif r(i,j)>r(1,1)r(1,1)=r(i,j);c=j;%把矩阵元素最大值所对应的列坐标送给c。
endendendif c<=90rot=-c; %确定旋转角度elserot=180-c;endpic=imrotate(l,rot,'crop'); %对图片进行旋转,矫正图像下面给出了Hough变换法对倾斜图像进行矫正后的图像:图7 Hough 变换法对图3.6矫正后图像2 Radon 变换法我们知道,一条直线沿它的法线方向投影所得的投影最长,而沿与其平行方向投影则所得的投影最短。
Radon 变换理论就是这样一种投影理论。
用这种方法可以检测图像中的直线。
Radon 变换的定义:二元函数f(x,y)的投影是在某一方向上的线积分,例如f(x,y)在垂直方向上的线积分是f(x,y)在x 方向上的投影,在水平方向上的线积分是在y 方向上的投影,沿y'方向的线积分是沿x'方向上的投影。
投影可沿任意角度进行,通常f(x,y)的Radon 变换是f(x,y)平行于y ’轴的线积分,格式如下:⎰+∞∞-+-=')cos 'sin ',sin 'cos '()'(dy y x y x f x R θθθθθ (3.13)其中⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡-=⎥⎦⎤⎢⎣⎡y x y x θθθθcos sin sin cos '' (3.14)图8 矩形函数在水平垂直方向和沿θ角方向的投影Radon 变换与计算机视觉中的Hough变换很相似,我们可以利用Radon变换来检测图像中的直线的倾斜角度[4]。
利用Radon变换检测直线倾斜角度的具体步骤为:(1)用edge函数计算图像的边缘二值图像,检测出原始图像中的直线。
图9 边缘图(2)计算边缘图像的Radon变换,对每一个象素为1的点进行运算(0-179度方向上分别做投影)其命令格式如下:theta=0:179;[r,xp]=radon(bw1,theta);%计算边缘图像的Radon变换figure,image(theta,xp,r);%显示变换效果图(3)检测出Radon变换矩阵中的峰值,这些峰值对应原始图像中的直线(上图中的四个亮点对应图3.9中的四条直线)。
Radon变换矩阵中的这些峰值的列坐标θ就是与原始图像中的直线垂直的直线的倾斜角度,所以图像中直线的倾角为90-θ。
图像倾角矫正具体程序实现如下:bw1=edge(l1,'sobel', 'horizontal');%用Sobel水平算子对图像边缘化bw1=imcrop(bw1,[0 0 500 100]);%对图像进行剪切,保留图像中的一条直线,减小运算量theta=0:179;%定义theta角度范围r=radon(bw1,theta);%对图像进行Radon变换[m,n]=size(r);c=1;for i=1:mfor j=1:nif r(1,1)<r(i,j)r(1,1)=r(i,j);c=j;endendend %检测Radon变换矩阵中的峰值所对应的列坐标rot=90-c;%确定旋转角度pic=imrotate(l1,rot,'crop');%对图像进行旋转矫正图10 矫正后所得图像3 线性回归法如果我们有一系列相互独立的点,其近似分布在一条直线附近,我们就可以通过一元线性回归法拟合这条直线。
图11 最小二乘原理图这条直线的一元线性回归模型为:εββ++=x y 10∞<=2D σε0=E ε (3.15)设上图中点的坐标分别是(x 1,y 1) , (x 2,y 2) , …… , (x n ,y n ) 。
用最小二乘算法来估计0β和1β。
则有:i i i x y εββ++=10 I = 1 , 2 , 3 , … ,n0=E i ε ,2D σε=i (3.16)用最小二乘算法来计算,找到准则函数,记为2110121,0)()(i ni ini ix yQ Q ∑∑==--===ββεββ (3.17)求Q 的最小值:0)(221100=---=∂∂∑=i ni i x y Qβββ (3.18)0)(221101=---=∂∂∑=i n i i i x y x Qβββ (3.19)由上式可得:xx xyL L =1β (3.20)xy 10ββ-= (3.21)其中:∑∑==-=-=ni i ni i xx x n x x x L 12221)( (3.22)∑∑==-=--=ni i i i n i i xy yx n y x y y x x L 11)()( (3.23)估计出了直线的斜率和截距,我们就可以估计出这条直线的方程了[5]。
将汽车牌照图像进行二值化,就可以得到其与背景的明显的交线,对于汽车牌照图像二值化的阈值完全可以取的高一点。
执行bw=im2bw(pic,0.3)我们可以得到下面的图像:图12 二值化后的汽车牌照图像从上图可以看出如果我们能够检测到图像上边缘的一系列的边界点,我们就可以通过最小二乘法拟合这条边界直线,从而确定图像的倾角。
具体方法如下:(1)找出边界直线上的点(每列第一次由黑变白的点,且这一列的下两点还是白的话就可以判为边界点[6]),将其行坐标存入数组a 即,列坐标存入数组b 。
(2)通过最小二乘法拟和这条边界直线,计算出其斜率L 。
(3)通过rot=atan (L ),计算直线的倾斜角度,然后对其矫正。
最小二乘法程序实现如下: [m,n]=size(l); bw=im2bw(l,0.3); %将图像二值化 t=1;s=1;for j=144:1: n-144 for i=1:fix(m/4)if bw(i,j)==0&bw(i+1,j)==1&bw(i+2,j)==1&bw(i+3,j)==1%检测边缘点c(t)=i;%边缘横坐标存入数组Cb1(s)=j;边缘纵坐标存入数组b1break;endendt=t+1;s=s+1;endx=0;y=0;x1=0;for i=1:length(c)x=x+c(i);x1=x1+c(i)^2;endfor i=1:length(b1)y=y+b1(i);endy=y/length(b1);x=x/length(c);c1=x;x=length(c)*x*x;lxy=x1-x;lxx=0;for i=1:length(b1)lxx=lxx+(c(i)-c1)*(b1(i)-y);endr=lxy/lxx;%以上为计算直线参数rot=atan(r);%取余切theta=rot*180/3.142;%将弧度转换为角度pic=imrotate(l,theta,'crop');图13 用最小二乘法对图6矫正后图像4 两点法这种方法理论上非常简单,就是:如果我们知道直线上不同两点的坐标,我们就可以求得到这条直线的斜率,进而确定直线倾角。