发明名称 一种基于图像拼接的柱面二维条码识读方法
摘要 本发明提出了一种基于图像拼接的柱面二维条码识读方法,步骤包括旋转采集一组二维条码图片、图像光照不均校正、条码边缘信息增强、条码图像及条码位置识别、条码模块划分、条码图像粗配准、条码图像精配准和图像拼接融合与条码识别。本发明改变现有的二维条码识读系统基于一幅图像的识别原理,能够完整采集柱面条码信息,消除柱面条码的畸变和光照不均等问题。根据Data Matrix二维条码图像的特征,设计的拼接融合算法能够很好解决二维条码图像拼接过程中遇到正确率不高、效率低等突出问题,实现快速准确的识读柱面二维条码信息。
申请公布号 CN102682266A 申请公布日期 2012.09.19
申请号 CN201210152638.8 申请日期 2012.05.17
申请人 西北工业大学 发明人 何卫平;林清松;雷蕾;王伟;刘涛
分类号 G06K7/10(2006.01)I 主分类号 G06K7/10(2006.01)I
代理机构 西北工业大学专利中心 61204 代理人 陈星
主权项 1.一种基于图像拼接的柱面二维条码识读方法,其特征在于:包括以下步骤:步骤1:连续采集二维条码的N幅图像<img file="FDA00001648868400011.GIF" wi="295" he="56" />所述N幅图像包含了二维条码的全部信息;每幅图像的宽度为w,高度为h,<img file="FDA00001648868400012.GIF" wi="103" he="62" />表示第n幅图像Mvtemp<sub>n</sub>中第i列第j行像素点的像素值;步骤2:校正图像光照不均:步骤(2-1):任意选取<img file="FDA00001648868400013.GIF" wi="268" he="55" />中包含条码信息的一幅图像Mvtemp,从图像Mvtemp中间h/2处向上遍历求取纵向梯度:<maths num="0001"><![CDATA[<math><mrow><msubsup><mi>grad</mi><mi>j</mi><mi>Mvtemp</mi></msubsup><mo>=</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mi>w</mi></munderover><mrow><mo>(</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mi>Mvtemp</mi></msubsup><mo>-</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>+</mo><mn>1</mn></mrow><mi>Mvtemp</mi></msubsup><mo>)</mo></mrow><mi>j</mi><mo>&Element;</mo><mrow><mo>(</mo><mi>h</mi><mo>/</mo><mn>2</mn><mo>,</mo><mi>h</mi><mo>)</mo></mrow></mrow></math>]]></maths>其中,<img file="FDA00001648868400015.GIF" wi="197" he="62" />表示图像Mvtemp中第j行的纵向梯度值,并在第y<sub>up</sub>行取到最大纵向梯度值;步骤(2-2):计算图像Mvtemp中背景区域的光照度数组:<maths num="0002"><![CDATA[<math><mrow><msubsup><mi>I</mi><mi>i</mi><mi>Mvtemp</mi></msubsup><mo>=</mo><mfrac><mn>1</mn><mn>20</mn></mfrac><munderover><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><msub><mi>y</mi><mi>up</mi></msub></mrow><mrow><msub><mi>y</mi><mi>up</mi></msub><mo>+</mo><mi>&beta;</mi></mrow></munderover><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mi>Mvtemp</mi></msubsup><mi>i</mi><mo>&Element;</mo><mo>[</mo><mn>0</mn><mo>,</mo><mi>w</mi><mo>)</mo></mrow></math>]]></maths>其中,图像Mvtemp中背景区域指第0列至第w-1列,第y<sub>up</sub>行至y<sub>up</sub>+β行的区域,β取10~h-y<sub>up</sub>;<img file="FDA00001648868400017.GIF" wi="120" he="56" />表示图像Mvtemp背景区域第i列的光照度;步骤(2-3):计算图像Mvtemp中背景区域的平均光照度<img file="FDA00001648868400018.GIF" wi="149" he="58" /><maths num="0003"><![CDATA[<math><mrow><msup><mover><mi>I</mi><mo>&OverBar;</mo></mover><mi>Mvtemp</mi></msup><mo>=</mo><mfrac><mn>1</mn><mrow><mrow><mo>(</mo><mi>&beta;</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><mi>w</mi></mrow></mfrac><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>w</mi><mo>-</mo><mn>1</mn></mrow></munderover><munderover><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><msub><mi>y</mi><mi>up</mi></msub></mrow><mrow><msub><mi>y</mi><mi>up</mi></msub><mo>+</mo><mi>&beta;</mi></mrow></munderover><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mi>Mvtemp</mi></msubsup></mrow></math>]]></maths>步骤(2-4):逆向校正图像序列<img file="FDA000016488684000110.GIF" wi="268" he="56" />中每一幅图像的光照不均:<maths num="0004"><![CDATA[<math><mrow><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mi>n</mi></msubsup><mo>=</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mi>n</mi></msubsup><mo>&CenterDot;</mo><msup><mover><mi>I</mi><mo>&OverBar;</mo></mover><mi>Mvtemp</mi></msup><mo>/</mo><msubsup><mi>I</mi><mi>i</mi><mi>Mvtemp</mi></msubsup><mi>n</mi><mo>&Element;</mo><mo>[</mo><mn>0</mn><mo>,</mo><mi>N</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>,</mo><mi>i</mi><mo>&Element;</mo><mo>[</mo><mn>0</mn><mo>,</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>,</mo><mi>j</mi><mo>&Element;</mo><mo>[</mo><mn>0</mn><mo>,</mo><mi>h</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>,</mo></mrow></math>]]></maths><img file="FDA000016488684000112.GIF" wi="1484" he="147" />步骤3:运用Roberts算子对图像序列<img file="FDA000016488684000113.GIF" wi="268" he="55" />做边缘轮廓信息提取,然后将边缘强度信息增加到原图像中,实现条码边缘信息增强;步骤4:识别条码图像及条码位置:步骤(4-1):计算图像序列<img file="FDA000016488684000114.GIF" wi="268" he="55" />中每幅图像的横向投影数据<img file="FDA000016488684000115.GIF" wi="112" he="56" /><maths num="0005"><![CDATA[<math><mrow><msubsup><mi>avg</mi><mi>j</mi><mi>n</mi></msubsup><mo>=</mo><mfrac><mn>1</mn><mi>w</mi></mfrac><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mi>w</mi></munderover><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mi>n</mi></msubsup><mi>j</mi><mo>&Element;</mo><mo>[</mo><mn>0</mn><mo>,</mo><mi>h</mi><mo>)</mo></mrow></math>]]></maths>对于第n幅图像,得到一组横向投影数据<img file="FDA00001648868400022.GIF" wi="210" he="64" />计算<img file="FDA00001648868400023.GIF" wi="186" he="64" />中的最小值<img file="FDA00001648868400024.GIF" wi="145" he="52" />步骤(4-2):将横向投影数据<img file="FDA00001648868400025.GIF" wi="187" he="64" />整体向下平移<img file="FDA00001648868400026.GIF" wi="146" he="52" />计算平移后横向投影数据<img file="FDA00001648868400027.GIF" wi="187" he="64" />的最大值<img file="FDA00001648868400028.GIF" wi="129" he="52" />和平均值<img file="FDA00001648868400029.GIF" wi="120" he="63" />对平移后的横向投影数据<img file="FDA000016488684000210.GIF" wi="186" he="64" />进行加权均值滤波和中值滤波,其中加权均值滤波模板为:<maths num="0006"><![CDATA[<math><mrow><mfrac><mn>1</mn><mn>9</mn></mfrac><mo>&times;</mo><mfenced open='[' close=']'><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>2</mn></mtd><mtd><mn>3</mn></mtd><mtd><mn>2</mn></mtd><mtd><mn>1</mn></mtd></mtr></mtable></mfenced></mrow></math>]]></maths>中值滤波采用5×1的滑动窗口;对滤波后的横向投影数据<img file="FDA000016488684000212.GIF" wi="186" he="64" />进行阈值分割,分割函数为:<img file="FDA000016488684000213.GIF" wi="627" he="283" />步骤(4-3):对经过步骤(4-2)处理后的横向投影数据<img file="FDA000016488684000214.GIF" wi="186" he="65" />进行数据拟合,拟合函数的形式为:<maths num="0007"><![CDATA[<math><mrow><mi>y</mi><mo>=</mo><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>a</mi><mn>1</mn></msub><mrow><mo>(</mo><mn>0</mn><mo>&le;</mo><mi>x</mi><mo>&lt;</mo><msub><mi>x</mi><mn>1</mn></msub><mo>)</mo></mrow></mtd></mtr><mtr><mtd><msub><mi>b</mi><mn>1</mn></msub><mrow><mo>(</mo><msub><mi>x</mi><mn>1</mn></msub><mo>&le;</mo><mi>x</mi><mo>&le;</mo><mi>h</mi><mo>/</mo><mn>2</mn><mo>)</mo></mrow></mtd></mtr><mtr><mtd><msub><mi>a</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>h</mi><mo>/</mo><mn>2</mn><mo>&lt;</mo><mi>x</mi><mo>&le;</mo><msub><mi>x</mi><mn>2</mn></msub><mo>)</mo></mrow></mtd></mtr><mtr><mtd><msub><mi>b</mi><mn>2</mn></msub><mrow><mo>(</mo><msub><mi>x</mi><mn>2</mn></msub><mo>&lt;</mo><mi>x</mi><mo>&lt;</mo><mi>h</mi><mo>)</mo></mrow></mtd></mtr></mtable></mfenced></mrow></math>]]></maths>其中,a<sub>1</sub>,b<sub>1</sub>,a<sub>2</sub>,b<sub>2</sub>为线性拟合函数的拟合变量,x<sub>1</sub>,x<sub>2</sub>为线性拟合函数的分段点;采用最小二乘拟合,得到拟合误差为:<maths num="0008"><![CDATA[<math><mrow><msubsup><mover><mi>S</mi><mo>^</mo></mover><mi>min</mi><mn>2</mn></msubsup><mrow><mo>(</mo><msubsup><mi>x</mi><mn>1</mn><mi>n</mi></msubsup><mo>)</mo></mrow><mo>=</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>h</mi><mo>/</mo><mn>2</mn></mrow></munderover><msup><mrow><mo>(</mo><msubsup><mi>avg</mi><mi>i</mi><mi>n</mi></msubsup><mo>)</mo></mrow><mn>2</mn></msup><mo>-</mo><mfrac><msup><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><msubsup><mi>x</mi><mn>1</mn><mi>n</mi></msubsup><mo>-</mo><mn>1</mn></mrow></munderover><msubsup><mi>avg</mi><mi>i</mi><mi>n</mi></msubsup><mo>)</mo></mrow><mn>2</mn></msup><msubsup><mi>x</mi><mn>1</mn><mi>n</mi></msubsup></mfrac><mo>-</mo><mfrac><msup><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><msubsup><mi>x</mi><mn>1</mn><mi>n</mi></msubsup></mrow><mrow><mi>h</mi><mo>/</mo><mn>2</mn></mrow></munderover><msubsup><mi>avg</mi><mi>i</mi><mi>n</mi></msubsup><mo>)</mo></mrow><mn>2</mn></msup><mrow><mi>h</mi><mo>/</mo><mn>2</mn><mo>-</mo><msubsup><mi>x</mi><mn>1</mn><mi>n</mi></msubsup><mo>+</mo><mn>1</mn></mrow></mfrac></mrow></math>]]></maths><maths num="0009"><![CDATA[<math><mrow><msubsup><mover><mi>S</mi><mo>^</mo></mover><mi>min</mi><mn>2</mn></msubsup><mrow><mo>(</mo><msubsup><mi>x</mi><mn>2</mn><mi>n</mi></msubsup><mo>)</mo></mrow><mo>=</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mi>h</mi><mo>/</mo><mn>2</mn><mo>+</mo><mn>1</mn></mrow><mrow><mi>h</mi><mo>-</mo><mn>1</mn></mrow></munderover><msup><mrow><mo>(</mo><msubsup><mi>avg</mi><mi>i</mi><mi>n</mi></msubsup><mo>)</mo></mrow><mn>2</mn></msup><mo>-</mo><mfrac><msup><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mi>h</mi><mo>/</mo><mn>2</mn><mo>+</mo><mn>1</mn></mrow><msubsup><mi>x</mi><mn>2</mn><mi>n</mi></msubsup></munderover><msubsup><mi>avg</mi><mi>i</mi><mi>n</mi></msubsup><mo>)</mo></mrow><mn>2</mn></msup><mrow><msubsup><mi>x</mi><mn>2</mn><mi>n</mi></msubsup><mo>-</mo><mi>h</mi><mo>/</mo><mn>2</mn></mrow></mfrac><mo>-</mo><mfrac><msup><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><msubsup><mi>x</mi><mn>2</mn><mi>n</mi></msubsup><mo>+</mo><mn>1</mn></mrow><mrow><mi>h</mi><mo>-</mo><mn>1</mn></mrow></munderover><msubsup><mi>avg</mi><mi>i</mi><mi>n</mi></msubsup><mo>)</mo></mrow><mn>2</mn></msup><mrow><mi>h</mi><mo>-</mo><msubsup><mi>x</mi><mn>2</mn><mi>n</mi></msubsup><mo>-</mo><mn>1</mn></mrow></mfrac></mrow></math>]]></maths>在第n幅图像中,计算拟合误差<img file="FDA000016488684000218.GIF" wi="156" he="64" />取最小值时对应的<img file="FDA000016488684000219.GIF" wi="68" he="50" />令<img file="FDA000016488684000220.GIF" wi="159" he="58" />计算拟合误差<img file="FDA000016488684000221.GIF" wi="155" he="64" />取最小值时对应的<img file="FDA000016488684000222.GIF" wi="67" he="50" />令<img file="FDA000016488684000223.GIF" wi="158" he="57" />步骤(4-4):重复步骤(4-1)~步骤(4-3),得到图像序列<img file="FDA00001648868400031.GIF" wi="268" he="55" />中每幅图像的<img file="FDA00001648868400032.GIF" wi="51" he="57" />和<img file="FDA00001648868400033.GIF" wi="78" he="57" />从而得到数组<img file="FDA00001648868400034.GIF" wi="240" he="83" />步骤(4-5):计算图像序列<img file="FDA00001648868400035.GIF" wi="268" he="56" />中每幅图像各自<img file="FDA00001648868400036.GIF" wi="50" he="58" />位置的纵向梯度值:<maths num="0010"><![CDATA[<math><mrow><msubsup><mi>grad</mi><msubsup><mi>y</mi><mi>d</mi><mi>n</mi></msubsup><mi>n</mi></msubsup><mo>=</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>w</mi><mo>-</mo><mn>1</mn></mrow></munderover><mo>|</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><msubsup><mi>y</mi><mi>d</mi><mi>n</mi></msubsup></mrow><mi>n</mi></msubsup><mo>-</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><msubsup><mi>y</mi><mi>d</mi><mi>n</mi></msubsup><mo>+</mo><mn>1</mn></mrow><mi>n</mi></msubsup><mo>|</mo></mrow></math>]]></maths>从而得到数组<img file="FDA00001648868400038.GIF" wi="258" he="100" />计算数组<img file="FDA00001648868400039.GIF" wi="232" he="100" />的平均值<img file="FDA000016488684000310.GIF" wi="125" he="60" />从数组<img file="FDA000016488684000311.GIF" wi="232" he="100" />中第n=0的数据开始向后依次与<img file="FDA000016488684000312.GIF" wi="103" he="59" />比较,当比较到第n=η的数据大于<img file="FDA000016488684000313.GIF" wi="103" he="59" />为止;从数组<img file="FDA000016488684000314.GIF" wi="233" he="100" />中第n=N-1的数据开始向前依次与<img file="FDA000016488684000315.GIF" wi="104" he="59" />比较,当比较到第n=κ的数据大于<img file="FDA000016488684000316.GIF" wi="104" he="60" />为止;图像序列<img file="FDA000016488684000317.GIF" wi="269" he="55" />中,Mvtemp<sub>η</sub>~Mvtemp<sub>κ</sub>的图像为条码图像;步骤(4-6):计算所有条码图像中<img file="FDA000016488684000318.GIF" wi="181" he="70" />值的平均值y<sub>s</sub>;任取条码图像中的一幅图像,计算该图像<img file="FDA000016488684000319.GIF" wi="45" he="51" />位置和<img file="FDA000016488684000320.GIF" wi="45" he="51" />位置处的纵向梯度值;当<img file="FDA000016488684000321.GIF" wi="44" he="51" />处的纵向梯度值大于<img file="FDA000016488684000322.GIF" wi="45" he="50" />处的纵向梯度值,则将所有条码图像从各自<img file="FDA000016488684000323.GIF" wi="44" he="50" />位置向上裁剪,保留<img file="FDA000016488684000324.GIF" wi="227" he="50" />作为新的条码图像;当<img file="FDA000016488684000325.GIF" wi="44" he="51" />处的纵向梯度值大于<img file="FDA000016488684000326.GIF" wi="44" he="51" />处的纵向梯度值,则将所有条码图像从各自<img file="FDA000016488684000327.GIF" wi="44" he="51" />位置向下裁剪,保留<img file="FDA000016488684000328.GIF" wi="224" he="51" />作为新的条码图像;将新得到的条码图像按原先顺序重新存为<img file="FDA000016488684000329.GIF" wi="342" he="69" />图像宽度w不变,高度为y<sub>s</sub>;步骤5:确定条码模块的划分方式:步骤(5-1):将<img file="FDA000016488684000330.GIF" wi="315" he="69" />按顺序横向排列,纵向对齐合并成一幅图像NMvtemp,图像NMvemp高度为y<sub>s</sub>,宽度为Mv;对图像NMvtemp做纵向梯度投影:<maths num="0011"><![CDATA[<math><mrow><msubsup><mrow><mi>y</mi><mi>grad</mi></mrow><mi>j</mi><mi>NMvtemp</mi></msubsup><mo>=</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>Mw</mi><mo>-</mo><mn>1</mn></mrow></munderover><mrow><mo>|</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mi>NMvtemp</mi></msubsup><mo>-</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>+</mo><mn>1</mn></mrow><mi>NMvtemp</mi></msubsup><mo>|</mo></mrow><mi>j</mi><mo>&Element;</mo><mrow><mo>[</mo><mn>0</mn><mo>,</mo><msub><mi>y</mi><mi>s</mi></msub><mo>)</mo></mrow></mrow></math>]]></maths>其中<img file="FDA000016488684000332.GIF" wi="242" he="62" />表示图像NMvtemp中第j行的纵向梯度;<img file="FDA000016488684000333.GIF" wi="184" he="62" />表示图像NMvtemp中第i列第j行像素点的像素值;步骤(5-2):从二维条码模块划分方式集合C={L×L}中选取划分方式l×l∈C,得到一组模块纵向分割点:<maths num="0012"><![CDATA[<math><mrow><mi>H</mi><mo>=</mo><msubsup><mrow><mo>{</mo><msub><mi>h</mi><mi>m</mi></msub><mo>|</mo><msub><mi>h</mi><mi>m</mi></msub><mo>=</mo><mfrac><msub><mi>y</mi><mi>s</mi></msub><mi>l</mi></mfrac><mo>&times;</mo><mi>m</mi><mo>}</mo></mrow><mrow><mi>m</mi><mo>=</mo><mn>1</mn></mrow><mrow><mi>l</mi><mo>-</mo><mn>1</mn></mrow></msubsup></mrow></math>]]></maths>步骤(5-3):计算图像NMvtemp在集合H中每个模块纵向分割点h<sub>m</sub>处的纵向梯度值<img file="FDA00001648868400041.GIF" wi="267" he="64" />并计算所有纵向梯度值<img file="FDA00001648868400042.GIF" wi="242" he="64" />的平均值,作为划分方式l×l∈C的梯度值;步骤(5-4):重复进行步骤(5-2)~步骤(5-3),计算集合C中所有划分方式的梯度值,取梯度值最大的划分方式p×p作为二维条码横向模块划分方式;步骤6:条码图像粗配准:步骤(6-1):将<img file="FDA00001648868400043.GIF" wi="315" he="70" />中的每一幅图像NMvtemp<sub>n</sub>都转化为一个p×w的数据矩阵,转化计算方式为:<maths num="0013"><![CDATA[<math><mrow><msup><mi>X</mi><mi>n</mi></msup><mo>=</mo><msubsup><mrow><mo>[</mo><msubsup><mrow><mo>(</mo><msubsup><mi>x</mi><mrow><mi>k</mi><mo>,</mo><mi>i</mi></mrow><mi>n</mi></msubsup><mo>=</mo><mfrac><mn>1</mn><msub><mi>M</mi><mi>s</mi></msub></mfrac><munderover><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mi>k</mi><msub><mi>M</mi><mi>s</mi></msub></mrow><mrow><mrow><mo>(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><msub><mi>M</mi><mi>s</mi></msub></mrow></munderover><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mi>n</mi></msubsup><mo>)</mo></mrow><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>w</mi><mo>-</mo><mn>1</mn></mrow></msubsup><mo>]</mo></mrow><mrow><mi>k</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>p</mi><mo>-</mo><mn>1</mn></mrow></msubsup></mrow></math>]]></maths>其中X<sup>n</sup>表示图像NMvtemp<sub>n</sub>对应的数据矩阵,<img file="FDA00001648868400045.GIF" wi="58" he="54" />表示矩阵中第k行第i列元素,M<sub>s</sub>表示条码模块的纵向尺寸,M<sub>s</sub>=y<sub>s</sub>/p;步骤6及以后步骤中<img file="FDA00001648868400046.GIF" wi="99" he="56" />表示第n幅图像NMvtemp<sub>n</sub>中第i列第j行像素点的像素值;步骤(6-2):将<img file="FDA00001648868400047.GIF" wi="316" he="69" />中相邻两幅图像对应的数据矩阵X<sup>n</sup>,X<sup>n+1</sup>步进重叠,步进列数δ<sub>g</sub>的范围为1列~5列;计算每次重叠时重叠区域元素的均方差S<sup>2</sup>(g<sup>n</sup>):<maths num="0014"><![CDATA[<math><mrow><msup><mi>S</mi><mn>2</mn></msup><mrow><mo>(</mo><msup><mi>g</mi><mi>n</mi></msup><mo>)</mo></mrow><mo>=</mo><mfrac><mn>1</mn><mrow><mi>p</mi><msup><mi>g</mi><mi>n</mi></msup></mrow></mfrac><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>p</mi><mo>-</mo><mn>1</mn></mrow></munderover><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><msup><mi>g</mi><mi>n</mi></msup></munderover><msup><mrow><mo>(</mo><msubsup><mi>X</mi><mrow><mi>k</mi><mo>,</mo><mi>i</mi></mrow><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msubsup><mo>-</mo><msubsup><mi>X</mi><mrow><mi>k</mi><mo>,</mo><mi>w</mi><mo>-</mo><mi>i</mi><mo>-</mo><msup><mi>g</mi><mi>n</mi></msup></mrow><mi>n</mi></msubsup><mo>)</mo></mrow><mn>2</mn></msup><mo>)</mo></mrow><mrow><mo>(</mo><mn>1</mn><mo>&le;</mo><msup><mi>g</mi><mi>n</mi></msup><mo>&le;</mo><mi>w</mi><mo>)</mo></mrow></mrow></math>]]></maths>其中S<sup>2</sup>(g<sup>n</sup>)表示数据矩阵重叠g<sup>n</sup>列元素时的均方差;步骤(6-3):计算数据矩阵X<sup>n</sup>,X<sup>n+1</sup>步进重叠过程中的所有S<sup>2</sup>(g<sup>n</sup>),取其中取值最小的三个均方差对应的重叠列数<img file="FDA00001648868400049.GIF" wi="189" he="50" />作为相邻两幅图像NMvtemp<sub>n</sub>和NMvtemp<sub>n+1</sub>间的粗配准位置,并记<img file="FDA000016488684000410.GIF" wi="351" he="68" />步骤(6-4):重复步骤(6-2)~步骤(6-3),对图像序列<img file="FDA000016488684000411.GIF" wi="297" he="56" />中每两幅相邻图像进行粗配准,得到粗配准位置序列<img file="FDA000016488684000412.GIF" wi="178" he="55" />步骤7:条码图像精配准:步骤(7-1):采用经典相似性测度方法的计算相邻两幅图像NMvtemp<sub>n</sub>和NMvtemp<sub>n+1</sub>在匹配位置g<sup>n</sup>处的匹配度R<sup>n</sup>(g<sup>n</sup>):<maths num="0015"><![CDATA[<math><mrow><msup><mi>R</mi><mi>n</mi></msup><mrow><mo>(</mo><msup><mi>g</mi><mi>n</mi></msup><mo>)</mo></mrow><mo>=</mo><mfrac><mrow><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><msup><mi>g</mi><mi>n</mi></msup><mo>-</mo><mn>1</mn></mrow></munderover><munderover><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><msub><mi>y</mi><mi>s</mi></msub><mo>-</mo><mn>1</mn></mrow></munderover><mrow><mo>(</mo><msubsup><mi>pix</mi><mrow><mi>w</mi><mo>-</mo><mi>i</mi><mo>-</mo><msup><mi>g</mi><mi>n</mi></msup><mo>,</mo><mi>j</mi></mrow><mi>n</mi></msubsup><mo>&times;</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msubsup><mo>)</mo></mrow></mrow><mrow><msqrt><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><msup><mi>g</mi><mi>n</mi></msup><mo>-</mo><mn>1</mn></mrow></munderover><munderover><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><msub><mi>y</mi><mi>s</mi></msub><mo>-</mo><mn>1</mn></mrow></munderover><msup><mrow><mo>(</mo><msubsup><mi>pix</mi><mrow><mi>w</mi><mo>-</mo><mi>i</mi><mo>-</mo><msup><mi>g</mi><mi>n</mi></msup><mo>,</mo><mi>j</mi></mrow><mi>n</mi></msubsup><mo>)</mo></mrow><mn>2</mn></msup></msqrt><msqrt><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><msup><mi>g</mi><mi>n</mi></msup><mo>-</mo><mn>1</mn></mrow></munderover><munderover><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mrow><msub><mi>y</mi><mi>s</mi></msub><mo>-</mo><mn>1</mn></mrow></munderover><msup><mrow><mo>(</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msubsup><mo>)</mo></mrow><mn>2</mn></msup></msqrt></mrow></mfrac><msup><mi>g</mi><mi>n</mi></msup><mo>&Element;</mo><mi>U</mi><mrow><mo>(</mo><msubsup><mi>g</mi><mn>1</mn><mi>n</mi></msubsup><mo>,</mo><mi>&delta;</mi><mo>)</mo></mrow><mo>&cap;</mo><mi>U</mi><mrow><mo>(</mo><msubsup><mi>g</mi><mn>2</mn><mi>n</mi></msubsup><mo>,</mo><mi>&delta;</mi><mo>)</mo></mrow><mo>&cap;</mo><mi>U</mi><mrow><mo>(</mo><msubsup><mi>g</mi><mn>3</mn><mi>n</mi></msubsup><mo>,</mo><mi>&delta;</mi><mo>)</mo></mrow></mrow></math>]]></maths>微调的列数δ取δ<sub>g</sub>+1;步骤(7-2):取匹配度R<sup>n</sup>(g<sup>n</sup>)的最大值为相邻两幅图像NMvtemp<sub>n</sub>和NMvtemp<sub>n+1</sub>间的最佳匹配度,记为R<sup>n</sup>=max{R<sup>n</sup>(g<sup>n</sup>)},并将max{R<sup>n</sup>(g<sup>n</sup>)}对应的位置g<sup>n</sup>作为相邻两幅图像NMvtemp<sub>n</sub>和NMvtemp<sub>n+1</sub>间的精配准位置,并记精配准位置C<sup>n</sup>=g<sup>n</sup>;步骤(7-3):重复步骤(7-1)~步骤(7-2),计算图像序列<img file="FDA00001648868400052.GIF" wi="296" he="56" />中每两幅相邻图像的最佳匹配度以及精配准位置,得到最佳匹配度数组<img file="FDA00001648868400053.GIF" wi="154" he="56" />和精配准位置数组<img file="FDA00001648868400054.GIF" wi="180" he="56" />步骤8:图像拼接融合与条码识别:步骤(8-1):遍历最佳匹配度数组<img file="FDA00001648868400055.GIF" wi="178" he="55" />以匹配度数值最小的两个位置点n<sub>1</sub>和n<sub>2</sub>作为分段点,将图像序列<img file="FDA00001648868400056.GIF" wi="297" he="56" />分为三个部分;步骤(8-2):将每个部分的图像按照图像间的精配准位置采用渐入渐出的加权平均法进行拼接融合,得到三个部分的合成图像Part<sub>0</sub>、Part<sub>1</sub>、Part<sub>2</sub>,三幅图像宽度分别为w<sub>0</sub>、w<sub>1</sub>、w<sub>2</sub>,高度是y<sub>s</sub>,三幅图像间的精配准位置分别为PC<sub>0</sub>、PC<sub>1</sub>,<img file="FDA00001648868400057.GIF" wi="216" he="51" /><maths num="0016"><![CDATA[<math><mrow><msub><mi>PC</mi><mn>1</mn></msub><mo>=</mo><msup><mi>C</mi><msub><mi>n</mi><mn>2</mn></msub></msup><mo>;</mo></mrow></math>]]></maths>步骤(8-3):计算<img file="FDA00001648868400059.GIF" wi="302" he="56" />中图像NMvtemp<sub>0</sub>的横向梯度:<maths num="0017"><![CDATA[<math><mrow><mi>x</mi><msubsup><mi>grad</mi><mi>j</mi><mrow><mi>NMvtem</mi><msub><mi>p</mi><mn>0</mn></msub></mrow></msubsup><mo>=</mo><munderover><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><msub><mi>y</mi><mi>s</mi></msub><mo>-</mo><mn>1</mn></mrow></munderover><mrow><mo>(</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn><mo>,</mo><mi>j</mi></mrow><mrow><mi>NMvtem</mi><msub><mi>p</mi><mn>0</mn></msub></mrow></msubsup><mo>-</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mrow><mi>NMvtem</mi><msub><mi>p</mi><mn>0</mn></msub></mrow></msubsup><mo>)</mo></mrow><mi>i</mi><mo>&Element;</mo><mrow><mo>[</mo><mn>0</mn><mo>,</mo><mi>w</mi><mo>)</mo></mrow></mrow></math>]]></maths><img file="FDA000016488684000511.GIF" wi="249" he="57" />代表图像NMvtemp<sub>0</sub>中i列的横向梯度;得到数组<img file="FDA000016488684000512.GIF" wi="383" he="62" />并计算<img file="FDA000016488684000513.GIF" wi="355" he="62" />中的最大值<img file="FDA000016488684000514.GIF" wi="275" he="65" />位置x<sub>l</sub>即为图像NMvtemp<sub>0</sub>中条码区域和空白区域分界位置;步骤(8-4):计算<img file="FDA000016488684000515.GIF" wi="302" he="56" />中图像NMvtemp<sub>M-1</sub>的横向梯度:<maths num="0018"><![CDATA[<math><mrow><mi>x</mi><msubsup><mi>grad</mi><mi>j</mi><mrow><mi>NMvtem</mi><msub><mi>p</mi><mrow><mi>M</mi><mo>-</mo><mn>1</mn></mrow></msub></mrow></msubsup><mo>=</mo><munderover><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><msub><mi>y</mi><mi>s</mi></msub><mo>-</mo><mn>1</mn></mrow></munderover><mrow><mo>(</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mrow><mi>NMvtem</mi><msub><mi>p</mi><mrow><mi>M</mi><mo>-</mo><mn>1</mn></mrow></msub></mrow></msubsup><mo>-</mo><msubsup><mi>pix</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn><mo>,</mo><mi>j</mi></mrow><mrow><mi>NMvtem</mi><msub><mi>p</mi><mrow><mi>M</mi><mo>-</mo><mn>1</mn></mrow></msub></mrow></msubsup><mo>)</mo></mrow><mi>i</mi><mo>&Element;</mo><mrow><mo>[</mo><mn>0</mn><mo>,</mo><mi>w</mi><mo>)</mo></mrow></mrow></math>]]></maths><img file="FDA000016488684000517.GIF" wi="279" he="57" />代表图像NMvtemp<sub>M-1</sub>中i列的横向梯度;得到数组<img file="FDA000016488684000518.GIF" wi="412" he="61" />并计算<img file="FDA00001648868400061.GIF" wi="387" he="61" />中的最大值<img file="FDA00001648868400062.GIF" wi="308" he="64" />位置x<sub>r</sub>即为图像NMvtemp<sub>M-1</sub>中条码区域和空白区域分界位置;步骤(8-5):将Part<sub>0</sub>、Part<sub>1</sub>、Part<sub>2</sub>三幅图像拼接融合后的宽度为w<sub>m</sub>=(x<sub>l</sub>+y<sub>s</sub>+w-x<sub>r</sub>),高度为y<sub>s</sub>;建立图像内存缓冲区,大小为w<sub>m</sub>×y<sub>s</sub>;将图像Part<sub>0</sub>放入缓冲区左侧,将图像Part<sub>2</sub>放入缓冲区右侧;判断|(w<sub>m</sub>-w<sub>0</sub>-w<sub>2</sub>)-(w<sub>1</sub>-PC<sub>0</sub>-PC<sub>1</sub>)|≤10,若满足判断条件则将图像Part<sub>1</sub>按照与Part<sub>0</sub>、Part<sub>2</sub>的精配准位置PC<sub>0</sub>、PC<sub>1</sub>放入缓冲区,重合区域采用渐入渐出的加权平均法完成图像拼接融合,进入步骤(8-7),若不满足判断条件则进入步骤(8-6);步骤(8-6):在图像内存缓冲区内将Part<sub>1</sub>放在两幅图像之间,开始位置与Part<sub>0</sub>重合w列,然后Part<sub>1</sub>步进向右运动,直到Part<sub>1</sub>与Part<sub>2</sub>重合w列为止;将步进运动过程中Part<sub>1</sub>与Part<sub>0</sub>、Part<sub>2</sub>分别重合的区域合并为联合重合区域,计算联合重合区域匹配度,匹配度计算方法同步骤(7-1),并步进运动过程中取到联合重合区域最大匹配度的位置作为配准位置,将图像Part<sub>1</sub>按照配准位置放入缓冲区,重合区域采用渐入渐出的加权平均法完成图像拼接融合;步骤(8-7):将图像内存缓冲区内拼接融合得到的二维条码图像,按照宽度进行裁剪,取二维条码图像x<sub>l</sub>~x<sub>l</sub>+y<sub>s</sub>部分,得到一幅新的y<sub>s</sub>×y<sub>s</sub>的Data Matrix二维条码图像,条码模块大小为M<sub>s</sub>×M<sub>s</sub>;使用解码系统读取新的Data Matrix二维条码图像中的条码信息,解码系统根据解码原理和Reed-Solomon纠错算法对其解码并纠错。
地址 710072 陕西省西安市友谊西路127号