发明名称 一种基于自适应边缘检测和映射模型的一维码识别算法
摘要 本发明公开了一种基于自适应边缘检测和映射模型的一维码识别算法。该算法利用一维码四个角点对一维码图片进行投影变换,校正一维码图像中可能存在的投影或者仿射变形,然后利用校正后的图像生成两种扫描线,一种是基于图像分块的,一种是基于梯度变化的,对于获得的扫描线采用一种自适应边缘检测算法来找到一维码条和空的边缘位置,接着采用一种边缘映射模型将获得的边缘位置映射到正确的编码位置,根据编码位置来获得条和空的宽度,从而依据条空的宽度比和编码规则求解一维码信息。按照本发明实现的一维码识别算法,能实现对变形,光照不均,噪声,模糊,以及变形加模糊的一维码都有较好的鲁棒性。
申请公布号 CN105975894A 申请公布日期 2016.09.28
申请号 CN201610310506.1 申请日期 2016.05.11
申请人 华中科技大学;武汉华威科智能技术有限公司 发明人 杨华;陈廉政;陈逸凡
分类号 G06K7/14(2006.01)I 主分类号 G06K7/14(2006.01)I
代理机构 华中科技大学专利中心 42201 代理人 梁鹏
主权项 一种基于自适应边缘检测和映射模型的一维码识别算法,其特征在于,该算法包括如下步骤:(1)投影校正依据所采集的所述一维码图像的四个角点,将所述四个角点所确定的矩形区域里的像素进行投影变换,得到校正后的图像Ic;(2)自适应边缘检测,其中该步骤包括如下子步骤:(2‑1)创建两类扫描线:首先获得M条基于梯度的扫描线:第m条线的起始点h<sub>m</sub>(0)=mΔ<sub>1</sub>,m∈[1,M],<img file="FDA0000987592620000011.GIF" wi="411" he="135" />其中f<sub>round</sub>是四舍五入取整操作,则第m条基于梯度的扫描线计算如下:<maths num="0001"><math><![CDATA[<mrow><mi>k</mi><mo>=</mo><mfenced open = "{" close = ""><mtable><mtr><mtd><mrow><mn>0</mn><mo>,</mo></mrow></mtd><mtd><mrow><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>+</mo><mn>1</mn><mo>,</mo><mi>y</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow><mo>=</mo><mn>0</mn></mrow></mtd></mtr><mtr><mtd><mrow><mfrac><mrow><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><mo>-</mo><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow></mrow><mrow><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>+</mo><mn>1</mn><mo>,</mo><mi>y</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow></mrow></mfrac><mo>,</mo></mrow></mtd><mtd><mrow><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>+</mo><mn>1</mn><mo>,</mo><mi>y</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow><mo>&NotEqual;</mo><mn>0</mn></mrow></mtd></mtr></mtable></mfenced></mrow>]]></math><img file="FDA0000987592620000012.GIF" wi="1093" he="231" /></maths>获得M条扫描线中的每条扫描线的起始点:h<sub>m</sub>(x+1)=h<sub>m</sub>(x)+f<sub>round</sub>(kΔx)获得M条梯度扫描线的集合:<maths num="0002"><math><![CDATA[<mrow><msubsup><mi>S</mi><mi>m</mi><mi>g</mi></msubsup><mrow><mo>(</mo><mi>x</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><mo>=</mo><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>+</mo><mn>1</mn><mo>,</mo><msub><mi>h</mi><mi>m</mi></msub><mo>(</mo><mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000987592620000013.GIF" wi="613" he="79" /></maths>其次获得基于图像分块的扫描线:从校正后图像Ic中截取N块,第n个图像块的纵坐标起始点为h<sub>n</sub>=nΔ<sub>2</sub>,终止点为h<sub>n</sub>+Δh,基于第n个图像块获得的第n条扫描线的计算如下,把图像分块中的像素点函数进行求和:<maths num="0003"><math><![CDATA[<mrow><msubsup><mi>S</mi><mi>n</mi><mi>b</mi></msubsup><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>=</mo><munderover><mo>&Sigma;</mo><mrow><mi>y</mi><mo>=</mo><msub><mi>h</mi><mi>n</mi></msub></mrow><mrow><msub><mi>h</mi><mi>n</mi></msub><mo>+</mo><mi>&Delta;</mi><mi>h</mi></mrow></munderover><msub><mi>I</mi><mi>c</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000987592620000021.GIF" wi="526" he="175" /></maths>共获得M+N条扫描线集合:<img file="FDA0000987592620000022.GIF" wi="638" he="87" />i∈[1,M+N];(2‑2)自适应边界检测对通过所述步骤(2‑1)中获得的扫描线集合S<sub>i</sub>(x)逐条进行处理,主要分为如下步骤:(2‑2‑1)对每条所述扫描线求取均值<img file="FDA0000987592620000023.GIF" wi="371" he="127" />其中<img file="FDA0000987592620000024.GIF" wi="58" he="70" />与扫描线S<sub>i</sub>(x)会形成一系列的交点<img file="FDA0000987592620000025.GIF" wi="330" he="79" />是第j个交点的坐标,j是在1和J之间,J表示总的交点数目,对<img file="FDA0000987592620000026.GIF" wi="146" he="79" />进行圆整,将其变为整数值;(2‑2‑2)依据所获得的交点<img file="FDA0000987592620000027.GIF" wi="163" he="78" />计算每两个交点间的扫描线的间隔均值<img file="FDA0000987592620000028.GIF" wi="810" he="151" />形成方波曲线<img file="FDA0000987592620000029.GIF" wi="214" he="86" />其中t为交点的序号编号,t在1与T之间,其中j在1与T之间;(2‑2‑3)由所述方波曲线<img file="FDA00009875926200000210.GIF" wi="176" he="87" />及参考线<img file="FDA00009875926200000211.GIF" wi="176" he="87" />按如下过程迭代来获得新的参考线:<maths num="0004"><math><![CDATA[<mrow><msubsup><mi>R</mi><mi>i</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msubsup><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>=</mo><mi>G</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mrow><mo>(</mo><msubsup><mi>&mu;R</mi><mi>i</mi><mi>t</mi></msubsup><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo><mo>(</mo><mrow><mn>1</mn><mo>-</mo><mi>&mu;</mi></mrow><mo>)</mo><msubsup><mi>Q</mi><mi>i</mi><mi>t</mi></msubsup><mo>(</mo><mi>x</mi><mo>)</mo><mo>)</mo></mrow></mrow>]]></math><img file="FDA00009875926200000212.GIF" wi="1158" he="110" /></maths>其中,μ=0.6,G(x)是一维高斯函数,<img file="FDA00009875926200000213.GIF" wi="619" he="143" />当t=1时,<img file="FDA00009875926200000214.GIF" wi="277" he="78" />所述迭代步骤中形成的参考线与扫描线会形成新的交点,如果t<T返回到第二步形成新的方波曲线,同时t=t+1,否则进入步骤(2‑2‑4);(2‑2‑4)完成T次迭代后,参考线<img file="FDA0000987592620000031.GIF" wi="139" he="71" />与扫描线S<sub>i</sub>(x)的交点就是一维码条和空的边缘位置;(3)边缘映射所述校正后的一维码图像中的边缘位置和编码位置之间的关系为:f<sub>b</sub>(f<sub>P</sub>(P<sup>T</sup>(j)))=γU(j)+b其中,<img file="FDA0000987592620000032.GIF" wi="812" he="158" />p<sub>0</sub>是一维码第一个边缘位置的坐标,c=sinθ/(ρ<sub>0</sub>cosθ),θ是一维码平面与相机采图平面的夹角,ρ<sub>0</sub>是相机的焦距,ρ是一维码到相机的距离,<img file="FDA0000987592620000033.GIF" wi="180" he="130" />相当于缩放项,其不影响像素宽度的比值,所以可以简化为1,所以<img file="FDA0000987592620000034.GIF" wi="662" he="158" />f<sub>b</sub>为依据确定的模糊影响下的校正公式,轻微的模糊对边缘位置的影响可以看做是边缘位置的移动,观察发现条变宽空变窄了,宽度变化为r<sub>blur</sub>,所以模糊的边缘位置校正公式为:f<sub>b</sub>(P<sup>T</sup>(j))=P<sup>T</sup>(j)+r<sub>blur</sub>(‑1)<sup>j</sup>,带入获得最终的校正模型为:<img file="FDA0000987592620000035.GIF" wi="1365" he="231" />(4)对于变形的一维码,可以通过分块,将边缘位置分成K块,每一小块的变形可以简化为投影变形;初始化参数<img file="FDA0000987592620000041.GIF" wi="251" he="87" />j是在1和J之间,J表示总的交点数目,<img file="FDA0000987592620000042.GIF" wi="46" he="55" />是用于编码的条和空的平均宽度,γ=2,其余参数b,c,p<sub>0</sub>和r<sub>blur</sub>初始化为0,采用Levenberg‑Marquardt算法迭代求取所有参数的最优解;将每组优化得到的编码位置U(τ),其中,τ是每组的位置索引,组合起来得到的U(j)值就是优化后的编码位置,利用U(j)进行解码,如果失败,重新将U(j)分成K组,用LM算法对每组进行优化求解,组合得到新的U(j),在进行解码,直至解码成功或者迭代次数达到设定阈值获得最终U(j);(5)从所述步骤(4)获得一维码编码位置U(j)后,依据编码规则实现解码。
地址 430074 湖北省武汉市洪山区珞喻路1037号