彭楷烽,朱厚耀,施冬冬,鄧清文,馬亮華
(廣州大學機械與電氣工程學院,廣州 510006)
條形碼在生活中隨處可見,其被廣泛應用于各行各業。一維條形碼符號已成為一種普遍使用的系統,并以其唯一標識產品信息的代碼來標識包裝的商品[1]。因為條形碼標識的唯一性,其被應用在各類分揀工作上。傳統的條碼識別是依靠激光掃描器,掃描器和條碼的相對位置是影響識別的關鍵原因,因此有很大的局限性[2]。隨著機器視覺的快速發展,不同學者提出了基于圖像的條碼自動定位識別方法。馮國文[3]利用局部二值模式對條碼樣本圖像進行特征提取并對SVM分類器進行訓練,再使用滑動窗口對圖像進行掃描并利用SVM分類器進行分類,最后聚集屬于條碼的子塊從而實現條碼的定位。Tropf等[4]利用DCT變換特性來區分條形碼與其他的紋理,在利用形態學操作平滑檢測到的條碼區域,最后提取區域的特征以檢測圖像中條碼的位置和方向,但該算法不夠魯棒。Zhang等[5]采用兩步處理,在低分辨率下,先從邊緣方向估計主方向,再拾取區域,并分別沿條形軸和編碼軸進行精確定位計算和投影;在高分辨率下,執行條形碼姿勢正則化、有效部分尋找和高光消除的圖像預處理。其雖能定位出條碼的位置,但對于分布在同一行的條碼還需進一步分割。Tekin等[6]首先通過掃描4個不同方向以確定具有交替極性的邊緣點集合,然后在垂直與掃描方向的方向上計算線分數以得到可能的條碼區域,最后用方向熵消除錯誤的信息。Fang等[7]通過降采樣,分別對每個像素點計算0h、45h、90h和135h的梯度,并以最大的值及其對應的方向作為該像素的梯度和方向,再轉換為二值圖并利用積分圖分析區域圖像,最后得到候選區域。
本文提出基于PCA的條形碼定位識別方法。首先對圖像進行預處理,通過自適應分塊技術對圖像進行分塊,接著運用主成分分析方法(PCA)對梯度方向一致的圖像塊進行篩選,并利用形態學方法對條形碼進行定位識別。除此之外,還使用了圖像金字塔提高了處理速度。實驗表明,本文提出的算法有很好的定位識別效果。
對于復雜背景下的圖像,可能會出現光照不均和噪聲污染等情況,因此進行條性碼定位識別之前需要進行適當的預處理。首先將圖像轉換成灰度圖像,再對圖像進行中值濾波。中值濾波是一種非線性的濾波技術,其基本思想是利用點鄰域灰度值的中值來代替當前像素點的灰度值,該技術既能去除脈沖噪聲和椒鹽噪聲,又能保留圖像的邊緣信息。經過濾波之后,利用sobel算子分別計算x方向和y方向的梯度。對于一個3 3的sobel邊緣檢測器,當梯度角距離水平或垂直方向越遠,對于梯度角的不準確性就會越明顯,而scharr算子在保證速度的同時還提高了準確度。scharr算子的模板為:
主成分分析是一種經典的統計技術,已應用于不同的領域,PCA的目標是減少數據集的維度并確定新的有意義的基礎變量[8],是一個分析多維分布并且從中提取出帶有最多信息量的維度子集的方法。經過邊緣檢測后,對圖像進行分塊,每個塊W的大小為b×b,利用PCA計算該窗口內主方向。假設窗口內任一點x方向和y方向的梯度為[ ]Gx,Gy,則自協方差矩陣C為:
利用SVD分解可求得協方差矩陣C的特征值和特征向量,假設最大的特征值λ1對應的特征向量u1(tx1,ty1),最小特征值λ2對應的特征向量為u2(tx2,ty2),引入方向強度的定義[9]為:
Str的取值在0~1之間,如果梯度方向指向同一方向,則λ2=0,Str=1,;在均勻分布的情況下,λ1=λ2,Str=0。在實際操作中,一般會設置一個方向一致性閾值T,若大于閾值則認為梯度方向大致相同。
經過主成分分析后,可以得到一些候選區域,將這些區域繪制到與原圖像尺寸一樣大的二值圖像上,候選區域灰度為1,其他為0。考慮到候選區域存在非條碼區域,進行腐蝕操作可以消除長條狀的非條碼區域,腐蝕的公式為:
為了使條碼區域擴大便于定位,進行膨脹操作,膨脹的公式為:
需要注意的是,進行腐蝕操作時使用的核元素大小應比分塊尺寸大,本文為(b+1,b+1);進行膨脹操作時使用的核元素大小應比分塊尺寸小,本文為(0.75×b,0.75×b)。經過形態學操作后,剩下一些候選區域,對這些區域求最小包圍矩形,根據矩形的長邊角度可以對原圖像進行矯正,并分割出候選區域進行識別。
基于PCA的條碼定位識別方法如圖1所示。
圖1 基于PCA的條碼定位識別方法
基于PCA的條碼定位識別算法雖能在復雜環境下對條碼進行定位識別,但是存在一個不足之處,那就是對圖像進行分塊時,要是分塊的尺寸不合適,就會直接導致無法正確定位條碼位置進而影響識別。因此,開發一種自適應分塊算法十分重要。在實際處理過程中,由于分塊大小影響定位的情況有兩種,分別是定位到部分條碼和完全定位不到條碼。基于這兩種情況,提出一種自適應分塊算法。先初始化一個分塊大小并在這種分塊大小下進行主成分分析篩選出候選區域,在進行形態學處理后,求最小包圍矩形,并將面積最大的矩形對應的區域進行矯正和分割。做一條與矩形長邊平行的線段,并從左端點開始,從第1次遇到黑色像素開始,之后每次記錄下黑白像素交替的位置點,直到記錄到第7次。若這個區域對應的是條碼部分,則可計算出條碼的黑白間隔,假設第1次記錄的點為p1,第7次記錄的點為p2,則分塊的尺寸可由下式確定:
具體的自適應分塊算法流程如圖2所示。
圖2 自適應分塊算法
在進行條形碼定位識別時,若在原圖的基礎上進行處理,將會十分耗費時間,不符合實時性的要求。為了獲得圖像數據的精簡表示,減少圖像數據量,本文采用圖像金字塔。如圖3所示,圖像金字塔從低到高尺寸逐級遞減,分辨率也逐級遞減。金字塔層每增加一層,像素點數量減少4倍,處理速度也就提高4倍[10]。先在低分辨率的情況下進行自適應分塊,并在計算出的分塊尺寸的基礎上進行基于PCA的條碼定位,最后在篩選的矩形區域的坐標映射回原分辨下的圖像進行識別。需要注意的是,金字塔的層數越多,處理速度會越快,但若是金字塔的層數過多,則會丟失大量信息,導致無法定位,所以要根據實際情況確定金字塔層數,本文采取的是4層。
圖3 圖像金字塔
圖4 本文算法流程
本文基于Opencv視覺庫在Windows平臺上進行算法的開發,Opencv是一個開源的計算機視覺庫,其提供易于使用的計算機視覺接口,有助于加速開發。算法實驗的流程如圖4所示。本文采用的初始分塊尺寸為20,方向一致性閾值T=0.85。經過算法識別定位的圖像如圖5所示。
圖5 定位識別后的結果圖
(1)由圖5(a)、(b)、(f)可知本文提出的算法對于多條形碼的定位識別表現出很好的優勢。可以看到圖5(a)和圖5(b)中的條碼距離拍攝平面距離是不相同的,它們之間存在一定程度的變形,但在提出的算法的處理下,依然能夠全部定位識別,可見提出的算法對一定程度變形的條碼識別表現出優勢。
(2)由圖5(c)、(d)、(e)可知本文提出的算法能夠實現復雜背景下的條碼定位識別。圖5(c)、(d)中的條碼雖然周圍有文字或者其他東西干擾,但由于條碼部分的主方向十分接近,因此算法能夠準確定位出來。除此之外,從圖5(e)可以看出,提出的算法也能夠實現對旋轉的條碼進行定位識別。
(3)由于算法加入了自適應分塊技術,因此能夠根據不同分辨率的圖像選擇不同的分塊尺寸,從而達到對不同的分辨率的條碼進行定位識別的目的。
本文提出基于PCA的條形碼定位識別方法,利用主成分分析方法實現對條碼方向的判斷,并采用自適應分塊技術和圖像金字塔,使得算法更加魯棒。實驗表明,本文提出的算法能夠達到很好的定位識別效果。