几种车牌图像倾斜角度矫正算法.docx
《几种车牌图像倾斜角度矫正算法.docx》由会员分享,可在线阅读,更多相关《几种车牌图像倾斜角度矫正算法.docx(17页珍藏版)》请在冰点文库上搜索。
![几种车牌图像倾斜角度矫正算法.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/dc251b95-e664-4369-9a08-7468d0db4dc7/dc251b95-e664-4369-9a08-7468d0db4dc71.gif)
几种车牌图像倾斜角度矫正算法
汽车牌照图像倾角矫正方法研究
首先我们对汽车牌照图像进行边缘检测,找出图像与背景的交线,然后就可以通过一定算法确定图像的倾斜角度了。
这里采用了Sobel水平方向算子对图像中的水平边缘直线进行检测[2]。
检测出图像中的直线后,我们要对其倾角进行计算,这里选用了Hough变换法、Radon变换法、最小二乘法和两点法四种方法来计算直线的倾角,下面将具体研究这四种方法并对其优缺点做出比较。
1Hough变换法
利用Hough变换法提取直线是一种变换域提取直线的方法,它把直线上的坐标变换到过点的直线的系数域,巧妙的利用了共线和直线相交的关系。
它的原理很简单:
假设有一条与原点距离为s,方向角为θ的一条直线,如图3.1所示:
图1一条与原点距离为s,方向角为θ的直线
直线上的每一点都满足方程:
(3.1)
证明过程如下:
图2坐标变换原理图
如图3.2所示:
(3.2)
(3.3)
所以:
(3.4)
m为直线l上任意一点
(3.5)
因为:
(3.6)
(3.7)
所以:
(3.8)
所以:
(3.9)
所以直线上任意一点都满足
(3.10)
图3x-y平面一点可以对应多个s,θ值
由图3.3可以看出点(x1,y1)即属于直线L1又属于直线L2,且满足:
(3.11)
(3.12)
所以,x-o-y平面上的一点(x1,y1)对应于s-o-θ平面上的一条曲线。
由于一条直线上的点都满足
所以x-o-y平面上处在一条直线上的点经过变换在S-O-θ平面上所得的曲线相交于一点。
如下图所示:
图4Hough变换前后对比图
因此可以把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);%产生初值为零的计数矩阵
fori=1:
m
forj=1:
n
ifbw(i,j)==1
fork=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);
fori=1:
m
forj=1:
n
ifr(i,j)>r(1,1)
r(1,1)=r(i,j);
c=j;%把矩阵元素最大值所对应的列坐标送给c。
end
end
end
ifc<=90
rot=-c;%确定旋转角度
else
rot=180-c;
end
pic=imrotate(l,rot,'crop');%对图片进行旋转,矫正图像
下面给出了Hough变换法对倾斜图像进行矫正后的图像:
图7Hough变换法对图3.6矫正后图像
2Radon变换法
我们知道,一条直线沿它的法线方向投影所得的投影最长,而沿与其平行方向投影则所得的投影最短。
Radon变换理论就是这样一种投影理论。
用这种方法可以检测图像中的直线。
Radon变换的定义:
二元函数f(x,y)的投影是在某一方向上的线积分,例如f(x,y)在垂直方向上的线积分是f(x,y)在x方向上的投影,在水平方向上的线积分是在y方向上的投影,沿y'方向的线积分是沿x'方向上的投影。
投影可沿任意角度进行,通常f(x,y)的Radon变换是f(x,y)平行于y’轴的线积分,格式如下:
(3.13)
其中
(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,[00500100]);%对图像进行剪切,保留图像中的一条直线,减小运算量
theta=0:
179;%定义theta角度范围
r=radon(bw1,theta);%对图像进行Radon变换
[m,n]=size(r);
c=1;
fori=1:
m
forj=1:
n
ifr(1,1)r(1,1)=r(i,j);
c=j;
end
end
end%检测Radon变换矩阵中的峰值所对应的列坐标
rot=90-c;%确定旋转角度
pic=imrotate(l1,rot,'crop');%对图像进行旋转矫正
图10矫正后所得图像
3线性回归法
如果我们有一系列相互独立的点,其近似分布在一条直线附近,我们就可以通过一元线性回归法拟合这条直线。
图11最小二乘原理图
这条直线的一元线性回归模型为:
(3.15)
设上图中点的坐标分别是(x1,y1),(x2,y2),……,(xn,yn)。
用最小二乘算法来估计
和
。
则有:
I=1,2,3,…,n
,
(3.16)
用最小二乘算法来计算,找到准则函数,记为
(3.17)
求Q的最小值:
(3.18)
(3.19)
由上式可得:
(3.20)
(3.21)
其中:
(3.22)
(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;
forj=144:
1:
n-144
fori=1:
fix(m/4)
ifbw(i,j)==0&bw(i+1,j)==1&bw(i+2,j)==1&bw(i+3,j)==1
%检测边缘点
c(t)=i;%边缘横坐标存入数组C
b1(s)=j;边缘纵坐标存入数组b1
break;
end
end
t=t+1;s=s+1;
end
x=0;y=0;x1=0;
fori=1:
length(c)
x=x+c(i);
x1=x1+c(i)^2;
end
fori=1:
length(b1)
y=y+b1(i);
end
y=y/length(b1);
x=x/length(c);
c1=x;
x=length(c)*x*x;
lxy=x1-x;
lxx=0;
fori=1:
length(b1)
lxx=lxx+(c(i)-c1)*(b1(i)-y);
end
r=lxy/lxx;
%以上为计算直线参数
rot=atan(r);
%取余切
theta=rot*180/3.142;
%将弧度转换为角度
pic=imrotate(l,theta,'crop');
图13用最小二乘法对图6矫正后图像
4两点法
这种方法理论上非常简单,就是:
如果我们知道直线上不同两点的坐标,我们就可
以求得到这条直线的斜率,进而确定直线倾角。
在使用最小二乘法时,我们已经检测到图像与背景交线的一系列坐标点,这些点近似分布在一条直线上。
图14两点法原理图
如图14所示:
a,b,c,a’,b’,c’点近似分布在一条直线L上,直线L的斜率与直线aa’,bb’,cc’的斜率近似,如果我们求出直线aa’,bb’,cc’的斜率,再求平均值,平均值就可以近似认为是直线L的斜率。
我们就可以确定L的倾角了。
这里选取了汽车牌照图像上边缘的两百个坐标点做出一百条直线(做出直线的两点的距离尽量大),然后计算这一百条直线的斜率,而后确定一百个倾斜角度并求出其平均值作为直线L的斜率。
下面是对图13计算所得数据的一部分:
Columns1through16
Columns17through32
rot1=
两点法具体程序实现如下:
[m,n]=size(l);
t=1;s=1;
forj=144:
n-144
fori=1:
fix(m/4)
ifbw(i,j)==0&bw(i+1,j)==1&bw(i+2,j)==1&bw(i+3,j)==1&bw(i+4,j)==1
c(t)=i;
b(s)=j;
break;
elseifbw(i,j)==1&bw(i+1,j)==1&bw(i+2,j)==1&bw(i+3,j)==1
c(t)=0;
b(s)=j;
break;
end
end
t=t+1;s=s+1;
end
%以上把边缘点的坐标存入数组c,b中。
v=1;
fori=1:
100
rot(v)=((c(262-i)-c(101-i)))/(b(262-i)-b(101-i));%计算每条直线的斜率
v=v+1;
end
rot=atan(rot);%取余切
rot=rot*180/3.142;%把弧度转换为角度
sum=0;
fori=1:
100
sum=sum+rot(i);
end
rot1=sum/100;
pic=imrotate(l,rot1,'crop');
figure(4),imshow(pic);
图15用两点法矫正的图像
上述四种方法对图像进行倾角矫正都非常有效。
Hough变换和Radon相似,其抗干扰能力比较强,但是运算量大,程序执行慢,其改进方法为:
我们可以不对整幅图像进行操作,可以在图像中选取一块(必须含有一条与倾角有关的直线)进行操作,从而减小运算量。
这里Hough变换法和Radon变换法进行倾角检测的最大精度为1度。
它们的优点是可以计算有断点的直线的倾角。
最小二乘法的优点就是运算量小,但是其抗干扰能力比较差,容易受到噪声的影响。
两点法虽然理论简单,但由于采样点比较多而且这些点服从随机分布,计算均值后能有效抑制干扰,实验表明其矫正效果很好,最大精度可以明显小于1度,而且计算量也很小。
最小二乘法和两点法不能计算有断点的直线倾角,这是这两种方法的缺点。
车牌图像倾斜角度矫正演示系统
利用MATLAB的GUI功能设计了车牌图像倾斜角度矫正系统,如图16所示。
图16汽车牌照图像识别系统