一种车牌倾斜矫正方法
技术领域
本发明属于计算机视觉和智能交通技术领域,具体涉及一种能对车牌进行水平倾斜矫正和垂直倾斜矫正的车牌倾斜矫正方法。
背景技术
随着智能交通领域的不断发展,目前在道路交通监控、自动收费系统、小区车辆管理系统及安全监测等方面都需要对车牌进行准确得识别。由于相机位置和角度的关系,拍摄得到的车辆照片中车牌很有可能会存在水平方向的倾斜或者垂直方向的倾斜,这对于后续的车牌字符切割和识别都造成了困扰,因而要想办法先对定位得到的车牌进行矫正。
当前用来矫正倾斜的车牌的方法也比较多,与本发明较接近的技术方案为:发明专利(胡晓芳。申请号:201510772814.1,名称:一种基于Radon变换的车牌倾斜角度矫正方法)提出一种基于Radon变换的车牌倾斜矫正算法,该算法首先对车牌进行边缘检测,在0°~179°每个方向上对图像进行Radon变换,通过Radon变换矩阵中峰值找到图像中的直线和直线相应的度数,即为车牌倾斜的度数,然后对图片进行相应度数的旋转,这种方法对车牌边框的依赖性比较大,如果车牌边框缺失就很容易矫正出错,存在计算量大、效率低等不足,此外,对于垂直倾斜即垂直方向上发生形变的车牌无法进行矫正;发明专利(蔡志旻,娄刚,刘伟,许焱,韦树艺。申请号:201510843159.4,名称:基于旋转投影的车牌倾斜矫正的方法)提出一种对车牌进行旋转以后计算投影值的倾斜矫正方法,该方法首先对车牌进行水平(垂直)sobel边缘检测,把车牌图像在-30°~30°之间每隔5个度数旋转一次,计算每旋转一次后的水平(垂直)方向投影值,每个投影值求一阶差分和,根据最大一阶差分和求出倾斜角所在区间,然后在该区间内每个角度上旋转计算投影值,求每个投影值的一阶差分和,最大一阶差分和对应的度数即为所求的倾斜角,这种方法要不断得旋转车牌图像,计算量相当大,非常耗时;文献(孙淑娟,李世祥,王玫。利用投影最小距离的车牌校正优化算法[J]。太原理工大学学报,2009,40(4):361-364)提出一种利用字符投影最小距离进行的车牌校正方法,该方法使车牌图像进行旋转,每次旋转计算图像在垂直方向上的投影,找到字符区域投影距离最小的角度,进行车牌旋转矫正,然后使车牌图像在不同角度进行水平错切操作,每次错切操作后计算图像在水平方向上的投影,找到字符区域投影距离最小的角度,进行车牌错切矫正,这种方法需要对车牌进行大量的旋转操作和水平错切操作,非常耗时,而且仅仅根据字符区域投影距离最小来判断倾斜角度这对于一些字符有粘连、污浊的情况非常敏感;文献(马红霞。基于子区域投影分析的车牌倾斜矫正[J]。计算机应用于软件,2012,29(6):253-255,293)提出一种基于子区域投影分析的车牌倾斜矫正方法,该方法首先将车牌划分为水平方向上的子区域,每个子区域进行投影分析每个子区域内字符区域中心点坐标,然后将各中心点拟合为一条直线,直线的倾角即为水平倾角,进行水平旋转矫正,然后将图像划分为垂直方向上的子区域,利用子区域投影计算车牌图像每一次错切变换的垂直投影数值为0的小区域长度之和,当数值为0的小区域长度之和最大的时候错切角度即为垂直倾角,该方法容易受到车牌污浊粘连等情况的影响,导致检测出错,而且需要进行多次错切变换,比较麻烦;文献(邢涛。面向移动终端的车牌识别关键技术研究[D]。杭州:浙江工业大学,2015)提出了一种基于改进的Radon变换的车牌倾斜检测方法,该方法首先对车牌进行sobel水平边缘检测,对检测出的边缘图像在与水平方向-30°~30°之间进行Radon变换,计算每个角度对应的投影方差,最大的方差对应的角度即为水平倾斜角,对车牌进行旋转,垂直方向先进行sobel垂直边缘检测,对检测出的边缘图像在与垂直方向-10°~10°之间进行Radon变换,计算每个角度对应的投影方差,最大的方差对应的角度即为垂直倾角,使用仿射变换中的错切变换进行垂直矫正。该方法虽然不依赖边框,抗干扰能力强,但是每一次矫正都需要固定计算-30°~30°之间或者-10°~10°之间每个角度上整张车牌的投影方差,即使车牌不存在倾斜角或者倾斜角很小,所以该方法还是比较耗时。
综上所述,当前车牌倾斜矫正的方法存在着如下不足:(1)对车牌边框的依赖性比较大,车牌边框缺失容易检测出错;(2)计算量大,效率低;(3)对车牌字符粘连,有污渍的情况比较敏感,抗干扰能力弱。
发明内容
针对现有技术存在的上述问题,特别是针对当前方法对车牌的倾斜会对车牌字符切割和字符识别形成干扰且难以解决的不足,本发明提出了一种车牌倾斜矫正方法。
所述的一种车牌倾斜矫正方法,其特征在于包括如下步骤:
步骤1:对车牌图像进行二值化,得到二值图像I,其分辨率为width*height;
步骤2:从步骤1)得到的二值图像I中提取指定部分形成新的图像newImage;
步骤3:对步骤2)的图像newImage进行sobel水平边缘检测,得到边缘图像edgeImage;
步骤4:在水平方向往顺时针方向30°的范围内,找到最接近车牌水平倾斜角度的度数angle,angle的初始值为0,具体步骤如下:
步骤4.1:以步骤3)的边缘图像edgeImage的左上角为坐标系原点,水平向右为x轴正方向,垂直向下为y轴正方向;坐标系中直线与x轴正方向的夹角记为θ,其中θ的取值范围为:0°≤θ≤30°,初始值为0°;
步骤4.2:针对当前角度θ定义一条直线方程y=kx+b,其中k表示当前角度θ下所有直线的斜率,x表示步骤4.1中定义的坐标系中的自变量,变化范围为:0≤x≤W,W表示边缘图像edgeImage的宽度,y表示步骤4.1中定义的坐标系中的因变量,变化范围为:0<y<H,H表示边缘图像edgeImage的高度,b表示θ角度下的某一条直线与y轴交点处的坐标y值;
步骤4.3:根据公式(1)、(2)分别计算当前角度θ下k的值和b的取值范围,令b的初始值为-k×W;
-k×W≤b≤H (2)
步骤4.4:根据步骤4.3计算得到的k值和当前的b值确定坐标系中的一条直线,在x的变化范围内根据公式(3)计算所有x的值对应的y的值,x变化范围为0≤x≤W,每得到一次y值都要根据公式(4)更新edgeImage在这一条直线上白色像素点总数count,count的初始值为0;
y=k×x+b (3)
其中p(x,y)为edgeImage在步骤4.1定义的坐标系中坐标为(x,y)处的像素灰度值;
步骤4.5:由步骤4.4得到的count值,根据公式(5)更新edgeImage在当前θ角度下所有直线上的白色像素点之和count1,根据公式(6)更新edgeImage在当前θ角度下所有直线上的白色像素点平方之和count2,count1和count2的初始值都为0,然后令b=b+1,进入步骤4.4循环,直到:b>H,则结束循环,进入步骤4.6;
count1=count1+count (5)
count2=count2+count×count (6)
步骤4.6:根据公式(7)计算mse,根据公式(8)更新angle的值,根据公式(9)更新times的值,根据公式(10)更新MAXmse的值,其中变量mse表示edgeImage在当前θ角度下的投影值均方差,MAXmse表示edgeImage最大投影值均方差,初始值为0,变量times表示在MAXmse值最近一次发生变化之后mse小于MAXmse的次数;
步骤4.7:令当前角度θ=θ+1,进入步骤4.2循环,直到:θ>30°或者times=5,则结束循环,进入步骤5;
步骤5:在步骤4获得的angle值基础上,在水平方向往逆时针方向30°的范围内,重新更新angle的值,具体步骤如下:
步骤5.1:在步骤4.1定义的坐标系中,令θ的取值范围为:-1°≤θ≤-30°,初始值为-1°;
步骤5.2:针对当前角度θ定义一条直线方程y=kx+b;
步骤5.3:根据公式(1)、(11)分别计算当前角度θ下k的值和b的取值范围,令b的初始值为0;
0≤b≤H-k×W (11)
步骤5.4:根据步骤5.3计算得到的k值和当前的b值确定坐标系中的一条直线,在x的变化范围内根据公式(3)计算所有x的值对应的y的值,x变化范围为0≤x≤W,每得到一次y值都要根据公式(4)更新count值,count的初始值为0;
步骤5.5:由步骤5.4得到的count值,根据公式(5)更新count1值,根据公式(6)更新count2值,count1和count2的初始值为0,然后令b=b+1,进入步骤5.4循环,直到:b>H-k×W,则结束循环,进入步骤5.6;
步骤5.6:根据公式(12)计算mse,根据公式(8)更新angle的值,根据公式(9)更新times的值,times的初始值为0,根据公式(10)更新MAXmse的值;
步骤5.7:令当前角度θ=θ-1,进入步骤5.2循环,直到:θ<-30°或者times=5,则结束循环,进入步骤6;
步骤6:把步骤5获得的angle值作为车牌在水平方向的倾斜角度,记为rightAngle,把步骤1获得的二值化车牌图像旋转rightAngle度,得到水平矫正过的二值化车牌图像;
步骤7:从步骤6获得的二值化车牌图像中提取部分图像形成新的图像newImage1;
步骤8:对步骤7获得的图像newImage1进行sobel垂直边缘检测,得到边缘图像edgeImage1;
步骤9:把步骤8获得的边缘图像edgeImage1分为左半部分和右半部分,在垂直方向往逆时针方向20°的范围内,找到最接近车牌左半部分垂直倾斜角度的度数angleL和最接近车牌右半部分垂直倾斜角度的度数angleR,初始值都为0,具体步骤如下:
步骤9.1:以步骤8获得的边缘图像edgeImage1的左上角为坐标系原点,水平向右为y轴正方向,垂直向下为x轴正方向;坐标系中直线与x轴正方向的夹角记为θ,其中θ的取值范围为:0°≤θ≤20°,初始值为0°;
步骤9.2:针对当前角度θ定义一条直线方程y=kx+b;其中x表示步骤9.1中定义的坐标系中的自变量,变化范围为:0≤x≤H1,H1表示边缘图像edgeImage1的高度,y表示步骤9.1中定义的坐标系中的因变量,变化范围为:0<y<W1×0.5,W1表示边缘图像edgeImage1的宽度;
步骤9.3:根据公式(1)、(13)分别计算θ角度下k的值和b的取值范围,令b
的初始值为-k×H1;
-k×H1<b<W1×0.5 (13)
步骤9.4:根据步骤9.3计算得到的k值和当前的b值确定坐标系中的一条直线,在x的变化范围内根据公式(3)计算所有x的值对应的y的值,x变化范围为0≤x≤H1,每得到一次y值都要根据公式(14)更新edgeImage1左半部分在这一条直线上白色像素点总数countL,countL的初始值为0,根据公式(15)更新edgeImage1右半部分平移到和左半部分重合的时候在这一条直线上白色像素点总数countR,countR的初始值为0;
其中p(x,y)为边缘图像edgeImage1在步骤9定义的坐标系中坐标(x,y)处的像素灰度值;
步骤9.5:由步骤9.4得到的countL值和countR值,根据公式(16)更新edgeImage1左半部分在当前θ角度下所有直线上的白色像素点之和countL1,根据公式(17)更新edgeImage1右半部分平移到和左半部分重合的时候在当前θ角度下所有直线上的白色像素点之和countR1,根据公式(18)更新edgeImage1左半部分在当前θ角度下所有直线上的白色像素点平方之和countL2,根据公式(19)更新edgeImage1右半部分平移到和左半部分重合的时候在当前θ角度下所有直线上的白色像素点平方之和countR2,countL1、countR1、countL2和countR2的初始值都为0,然后令b=b+1,重新进入步骤9.4循环,直到:b>W1×0.5,则结束循环,进入步骤9.6;
countL1=countL1+countL (16)
countR1=countR1+countR (17)
countL2=countL2+countL×countL (18)
countR2=countR2+countR×countR (19)
步骤9.6:根据公式(20)计算mseL,根据公式(21)计算mseR,根据公式(22)更新angleL的值,根据公式(23)更新angleR的值,根据公式(24)更新timesL的值,根据公式(25)更新timesR的值,根据公式(26)更新MAXmseL的值,根据公式(27)更新MAXmseR的值,其中变量mseL表示edgeImage1左半部分在当前θ角度下的投影值均方差,变量mseR表示edgeImage1右半部分在当前θ角度下的投影值均方差,变量MAXmseL表示edgeImage1左半部分最大投影值均方差,初始值为0,变量MAXmseR表示edgeImage1右半部分最大投影值均方差,初始值为0,变量timesL表示在MAXmseL值最近一次发生变化之后mseL小于MAXmseL的次数,变量timesR表示在MAXmseR值最近一次发生变化之后mseR小于MAXmseR的次数;
步骤9.7:令当前角度θ=θ+1,进入步骤9.2循环,直到:θ>20°或者timesL=timesR=5,则结束循环,进入步骤10;
步骤10:在步骤9获得的angleL值和angleR值基础上,在垂直方向往顺时针方向20°的范围内,重新更新angleL的值和angleR的值,具体步骤如下:
步骤10.1:在步骤9.1定义的坐标系中,令θ的取值范围为:-20°≤θ≤-1°,初始值为-1°;
步骤10.2:针对当前角度θ定义一条直线方程y=kx+b;
步骤10.3:根据公式(1)、(28)分别计算θ角度下k的值和b的取值范围,令b的初始值为0;
0<b<W1×0.5-k×H1 (28)
步骤10.4:根据步骤10.3计算得到的k值和当前的b值确定坐标系中的一条直线,在x的变化范围内根据公式(3)计算所有x的值对应的y的值,x变化范围为0≤x≤H1,每得到一次y值都要根据公式(14)更新countL,countL的初始值为0,根据公式(15)更新countR,countR的初始值为0;
步骤10.5:由步骤10.4得到的countL值和countR值,根据公式(16)更新countL1,根据公式(17)更新countR1,根据公式(18)更新countL2,根据公式(19)更新countR2,countL1、countR1、countL2和countR2的初始值都为0,然后令b=b+1,进入步骤10.4循环,直到:b>W1×0.5-k×H1,则结束循环,进入步骤10.6;
步骤10.6:根据公式(29)计算mseL,根据公式(30)计算mseR,根据公式(22)更新angleL的值,根据公式(23)更新angleR的值,根据公式(24)更新timesL的值,根据公式(25)更新timesR的值,timesL和timesR的初始值为0,根据公式(26)更新MAXmseL的值,根据公式(27)更新MAXmseR的值;
步骤10.7:令当前角度θ=θ-1,进入步骤10.2循环,直到:θ<-20°或者timesL=timesR=5,则结束循环,进入步骤11;
步骤11:由步骤10获得的angleL和angleR,根据公式(31)计算车牌在垂直方向的倾斜角度rightAngle1;
步骤12:创建一幅空白图像newImage2,图像宽度等于width1,图像高度等于height1;
步骤13:以步骤6获得的二值化图像的左上角为坐标系原点,水平向右为y轴正方向,垂直向下为x轴正方向,根据公式(32)计算步骤6获得的二值化图像中每一个像素点坐标(x,y)在图像newImage2中的对应点坐标(x1,y1),使图像newImage2中的(x1,y1)处的像素灰度值等于步骤6获得的二值化图像中(x,y)处的像素灰度值,最终得到的图像newImage2即为经过垂直矫正后的车牌二值化图像
所述的一种车牌倾斜矫正方法,其特征在于步骤2)中提取指定部分形成新的图像newImage的具体步骤如下:
步骤2.1:创建一幅白色背景空白图像为newImage,图像宽度等于width,图像高度等于height的四分之三;
步骤2.2:从二值图像I中选取矩形区域(0,0,width,height×0.25)内的图像部分,拷贝到图像newImage中的矩形区域(0,height×0.125,width,height×0.25)内;
步骤2.3:从二值图像I中选取矩形区域(0,height×0.75,width,height×0.25)内的图像部分,拷贝到图像newImage中的矩形区域(0,height×0.375,width,height×0.25)内。
所述的一种车牌倾斜矫正方法,其特征在于步骤7)中提取部分图像形成新的图像newImage1的具体步骤如下:
步骤7.1:创建一幅白色背景空白图像为newImage1,图像宽度等于width1,图像高度等于height1的三分之一;其中width1为步骤6获得的二值化图像的宽度,height1为步骤6获得的二值化图像的高度;
步骤7.2:从步骤6获得的二值化图像中选取矩形区域(0,height1*1/3,width1,height1*1/3)内的图像部分,拷贝到图像newImage1中。
通过采用上述技术,与现有技术相比,本发明的有益效果如下:
1)本发明通过改变θ角度计算车牌图像在不同方向的投影值,不用对车牌图像本身进行旋转,在很大程度上提高了程序的效率;
2)本发明通过水平和垂直矫正方式,在计算倾角时不是对原始的图像进行计算投影值,而是分别在原始图像上提取部分图像组成新的小图像进行操作,可以减少很大的计算量,在效率上也有很大的提高
3)本发明一旦找到某个角度的车牌投影均方差可以确定为最大均方差就不再计算其他角度,可以提高车牌矫正的效率;
4)本发明根据车牌的投影值均方差来确定倾斜角度很好得利用了投影值信息,不依赖于车牌边框,增强了对字符粘连、污渍的抗干扰能力;
5)本发明在垂直矫正的时候分左半部分和右半部分分别计算垂直倾角,然后根据两边得到的倾角相比较得到最终垂直倾角,在一定程度上提高了倾角检测的正确性。
附图说明
图1为本发明实施例选取的待矫正二值化车牌图像;
图2为本发明水平矫正之后的二值化车牌图像;
图3为本发明在车牌水平矫正的基础上进行垂直矫正之后的二值化车牌图像;
图4为本发明水平矫正时用于检测水平倾角的部分图像;
图5为本发明垂直矫正时用于检测垂直倾角的部分图像。
具体实施方式
下面结合附图说明和实施例来详细阐述本发明的车牌倾斜矫正方法的具体实施方式。应当理解,此处所描述的具体实施例仅仅用于解释本发明,并不用于限定本发明。
如图所示,本发明的一种车牌倾斜矫正方法,包括如下步骤:
步骤1:对车牌图像进行二值化,得到二值化图像,如图1所示;
步骤2:从步骤1获得的二值化图像中提取指定部分形成新的图像newImage,如图4所示,具体步骤如下:
步骤2.1:创建一幅白色背景空白图像为newImage,图像宽度等于width,图像高度等于height的四分之三;其中width为步骤1获得的二值化图像的宽度,height为步骤1获得的二值化图像的高度;
步骤2.2:从步骤1获得的二值化图像中选取矩形区域(0,0,width,height×0.25)内的图像部分,拷贝到图像newImage中的矩形区域(0,height×0.125,width,height×0.25)内;
步骤2.3:从步骤1获得的二值化图像中选取矩形区域(0,height×0.75,width,height×0.25)内的图像部分,拷贝到图像newImage中的矩形区域(0,height×0.375,width,height×0.25)内;
步骤3:对步骤2获得的图像newImage进行sobel水平边缘检测,得到边缘图像记为edgeImage;
步骤4:在水平方向往顺时针方向30°的范围内,找到最接近车牌水平倾斜角度的度数angle,angle的初始值为0,结果如图4所示,具体步骤如下:
步骤4.1:以步骤3获得的边缘图像edgeImage的左上角为坐标系原点,水平向右为x轴正方向,垂直向下为y轴正方向;坐标系中直线与x轴正方向的夹角记为θ,其中θ的取值范围为:0°≤θ≤30°,初始值为0°;
步骤4.2:针对当前角度θ定义一条直线方程y=kx+b,其中k表示当前角度θ下所有直线的斜率,x表示步骤4.1中定义的坐标系中的自变量,变化范围为:0≤x≤W,W表示边缘图像edgeImage的宽度,y表示步骤4.1中定义的坐标系中的因变量,变化范围为:0<y<H,H表示边缘图像edgeImage的高度,b表示θ角度下的某一条直线与y轴交点处的坐标y值;
步骤4.3:根据公式(1)、(2)分别计算当前角度θ下k的值和b的取值范围,令b的初始值为-k×W;
-k×W≤b≤H (2)
步骤4.4:根据步骤4.3计算得到的k值和当前的b值确定坐标系中的一条直线,在x的变化范围内根据公式(3)计算所有x的值对应的y的值,x变化范围为0≤x≤W,每得到一次y值都要根据公式(4)更新edgeImage在这一条直线上白色像素点总数count,count的初始值为0;
y=k×x+b (3)
其中p(x,y)为edgeImage在步骤4.1定义的坐标系中坐标为(x,y)处的像素灰度值;
步骤4.5:由步骤4.4得到的count值,根据公式(5)更新edgeImage在当前θ角度下所有直线上的白色像素点之和count1,根据公式(6)更新edgeImage在当前θ角度下所有直线上的白色像素点平方之和count2,count1和count2的初始值都为0,然后令b=b+1,进入步骤4.4循环,直到:b>H,则结束循环,进入步骤4.6;
count1=count1+count (5)
count2=count2+count×count (6)
步骤4.6:根据公式(7)计算mse,根据公式(8)更新angle的值,根据公式(9)更新times的值,根据公式(10)更新MAXmse的值,其中变量mse表示edgeImage在当前θ角度下的投影值均方差,MAXmse表示edgeImage最大投影值均方差,初始值为0,变量times表示在MAXmse值最近一次发生变化之后mse小于MAXmse的次数;
步骤4.7:令当前角度θ=θ+1,进入步骤4.2循环,直到:θ>30°或者times=5,则结束循环,进入步骤5;
步骤5:在步骤4获得的angle值基础上,在水平方向往逆时针方向30°的范围内,重新更新angle的值,具体步骤如下:
步骤5.1:在步骤4.1定义的坐标系中,令θ的取值范围为:-1°≤θ≤-30°,初始值为-1°;
步骤5.2:针对当前角度θ定义一条直线方程y=kx+b;
步骤5.3:根据公式(1)、(11)分别计算当前角度θ下k的值和b的取值范围,令b的初始值为0;
0≤b≤H-k×W (11)
步骤5.4:根据步骤5.3计算得到的k值和当前的b值确定坐标系中的一条直线,在x的变化范围内根据公式(3)计算所有x的值对应的y的值,x变化范围为0≤x≤W,每得到一次y值都要根据公式(4)更新count值,count的初始值为0;
步骤5.5:由步骤5.4得到的count值,根据公式(5)更新count1值,根据公式(6)更新count2值,count1和count2的初始值为0,然后令b=b+1,进入步骤5.4循环,直到:b>H-k×W,则结束循环,进入步骤5.6;
步骤5.6:根据公式(12)计算mse,根据公式(8)更新angle的值,根据公式(9)更新times的值,times的初始值为0,根据公式(10)更新MAXmse的值;
步骤5.7:令当前角度θ=θ-1,进入步骤5.2循环,直到:θ<-30°或者times=5,则结束循环,进入步骤6;
步骤6:把步骤5获得的angle值作为车牌在水平方向的倾斜角度,记为rightAngle,把步骤1获得的二值化车牌图像旋转rightAngle度,得到水平矫正过的二值化车牌图像,如图2所示;
步骤7:从步骤6获得的二值化图像中提取部分图像形成新的图像newImage1,如图5所示,具体步骤如下:
步骤7.1:创建一幅白色背景空白图像为newImage1,图像宽度等于width1,图像高度等于height1的三分之一;其中width1为步骤6获得的二值化图像的宽度,height1为步骤6获得的二值化图像的高度;
步骤7.2:从步骤6获得的二值化图像中选取矩形区域(0,height1*1/3,width1,height1*1/3)内的图像部分,拷贝到图像newImage1中;
步骤8:对步骤7获得的图像newImage1进行sobel垂直边缘检测,得到边缘图像edgeImage1;
步骤9:把步骤8获得的边缘图像edgeImage1分为左半部分和右半部分,在垂直方向往逆时针方向20°的范围内,找到最接近车牌左半部分垂直倾斜角度的度数angleL和最接近车牌右半部分垂直倾斜角度的度数angleR,初始值都为0,结果如图5所示,具体步骤如下:
步骤9.1:以步骤8获得的边缘图像edgeImage1的左上角为坐标系原点,水平向右为y轴正方向,垂直向下为x轴正方向;坐标系中直线与x轴正方向的夹角记为θ,其中θ的取值范围为:0°≤θ≤20°,初始值为0°;
步骤9.2:针对当前角度θ定义一条直线方程y=kx+b;其中x表示步骤9.1中定义的坐标系中的自变量,变化范围为:0≤x≤H1,H1表示边缘图像edgeImage1的高度,y表示步骤9.1中定义的坐标系中的因变量,变化范围为:0<y<W1×0.5,W1表示边缘图像edgeImage1的宽度;
步骤9.3:根据公式(1)、(13)分别计算θ角度下k的值和b的取值范围,令b的初始值为-k×H1;
-k×H1<b<W1×0.5 (13)
步骤9.4:根据步骤9.3计算得到的k值和当前的b值确定坐标系中的一条直线,在x的变化范围内根据公式(3)计算所有x的值对应的y的值,x变化范围为0≤x≤H1,每得到一次y值都要根据公式(14)更新edgeImage1左半部分在这一条直线上白色像素点总数countL,countL的初始值为0,根据公式(15)更新edgeImage1右半部分平移到和左半部分重合的时候在这一条直线上白色像素点总数countR,countR的初始值为0;
其中p(x,y)为边缘图像edgeImage1在步骤9定义的坐标系中坐标(x,y)处的像素灰度值;
步骤9.5:由步骤9.4得到的countL值和countR值,根据公式(16)更新edgeImage1左半部分在当前θ角度下所有直线上的白色像素点之和countL1,根据公式(17)更新edgeImage1右半部分平移到和左半部分重合的时候在当前θ角度下所有直线上的白色像素点之和countR1,根据公式(18)更新edgeImage1左半部分在当前θ角度下所有直线上的白色像素点平方之和countL2,根据公式(19)更新edgeImage1右半部分平移到和左半部分重合的时候在当前θ角度下所有直线上的白色像素点平方之和countR2,countL1、countR1、countL2和countR2的初始值都为0,然后令b=b+1,重新进入步骤9.4循环,直到:b>W1×0.5,则结束循环,进入步骤9.6;
countL1=countL1+countL (16)
countR1=countR1+countR (17)
countL2=countL2+countL×countL (18)
countR2=countR2+countR×countR (19)
步骤9.6:根据公式(20)计算mseL,根据公式(21)计算mseR,根据公式(22)更新angleL的值,根据公式(23)更新angleR的值,根据公式(24)更新timesL的值,根据公式(25)更新timesR的值,根据公式(26)更新MAXmseL的值,根据公式(27)更新MAXmseR的值,其中变量mseL表示edgeImage1左半部分在当前θ角度下的投影值均方差,变量mseR表示edgeImage1右半部分在当前θ角度下的投影值均方差,变量MAXmseL表示edgeImage1左半部分最大投影值均方差,初始值为0,变量MAXmseR表示edgeImage1右半部分最大投影值均方差,初始值为0,变量timesL表示在MAXmseL值最近一次发生变化之后mseL小于MAXmseL的次数,变量timesR表示在MAXmseR值最近一次发生变化之后mseR小于MAXmseR的次数;
步骤9.7:令当前角度θ=θ+1,进入步骤9.2循环,直到:θ>20°或者timesL=timesR=5,则结束循环,进入步骤10;
步骤10:在步骤9获得的angleL值和angleR值基础上,在垂直方向往顺时针方向20°的范围内,重新更新angleL的值和angleR的值,具体步骤如下:
步骤10.1:在步骤9.1定义的坐标系中,令θ的取值范围为:-20°≤θ≤-1°,初始值为-1°;
步骤10.2:针对当前角度θ定义一条直线方程y=kx+b;
步骤10.3:根据公式(1)、(28)分别计算θ角度下k的值和b的取值范围,令b的初始值为0;
0<b<W1×0.5-k×H1 (28)
步骤10.4:根据步骤10.3计算得到的k值和当前的b值确定坐标系中的一条直线,在x的变化范围内根据公式(3)计算所有x的值对应的y的值,x变化范围为0≤x≤H1,每得到一次y值都要根据公式(14)更新countL,countL的初始值为0,根据公式(15)更新countR,countR的初始值为0;
步骤10.5:由步骤10.4得到的countL值和countR值,根据公式(16)更新countL1,根据公式(17)更新countR1,根据公式(18)更新countL2,根据公式(19)更新countR2,countL1、countR1、countL2和countR2的初始值都为0,然后令b=b+1,进入步骤10.4循环,直到:b>W1×0.5-k×H1,则结束循环,进入步骤10.6;
步骤10.6:根据公式(29)计算mseL,根据公式(30)计算mseR,根据公式(22)更新angleL的值,根据公式(23)更新angleR的值,根据公式(24)更新timesL的值,根据公式(25)更新timesR的值,timesL和timesR的初始值为0,根据公式(26)更新MAXmseL的值,根据公式(27)更新MAXmseR的值;
步骤10.7:令当前角度θ=θ-1,进入步骤10.2循环,直到:θ<-20°或者timesL=timesR=5,则结束循环,进入步骤11;
步骤11:由步骤10获得的angleL和angleR,根据公式(31)计算车牌在垂直方向的倾斜角度rightAngle1;
步骤12:创建一幅空白图像newImage2,图像宽度等于width1,图像高度等于height1;
步骤13:以步骤6获得的二值化图像的左上角为坐标系原点,水平向右为y轴正方向,垂直向下为x轴正方向,根据公式(32)计算步骤6获得的二值化图像中每一个像素点坐标(x,y)在图像newImage2中的对应点坐标(x1,y1),使图像newImage2中的(x1,y1)处的像素灰度值等于步骤6获得的二值化图像中(x,y)处的像素灰度值,最终得到的图像newImage2即为经过垂直矫正后的车牌二值化图像,如图3所示;