m基于EAN13字符編碼規(guī)則的一維條形碼條碼寬度計算和數(shù)字譯碼matlab仿真

1.算法仿真效果

matlab2022a仿真結果如下:


2.算法涉及理論知識概要

條碼技術是在計算機的應用實踐中產(chǎn)生和發(fā)展起來的一種自動識別技術,條碼應用技術就是應用條碼系統(tǒng)進行的信息處理技術。條碼技術的研究始于20世紀中期,是繼計算機技術應用和發(fā)展應運而生的。隨著70年代微處理器的問世,標志著“信息化社會”的到來,它要求人們對社會上各個領域的信息、數(shù)據(jù)實施正確、有效、及時的采集、傳遞和管理。因此如何代替人的視覺、人的手工操作、或者在復雜的環(huán)境中正確、迅速地獲取信息并加以識別,成為人們普遍關心和有關人員精心研究的課題。通俗的說條形碼是指在淺色襯底上印有深色矩形的線條(也稱條碼)排列而成的編碼,其碼條和空白條的數(shù)量和寬度按一定的規(guī)則(標準)排列。條形碼是由一組規(guī)則排列的條、空、相應的數(shù)字組成。這種用條、空組成的數(shù)據(jù)編碼可以供機器識讀,而且很容易譯成二進制數(shù)和十進制數(shù)。這些條和空可以有各種不同的組合方法,構成不同的圖形符號,即各種符號體系,適用于不同的應用場合。條碼系統(tǒng)是由條碼符號設計、制作及掃描閱讀組成的自動識別系統(tǒng)。微電子技術和激光技術的發(fā)展使得條碼識別系統(tǒng)越來越受到人們的關注。條碼是迄今為止最經(jīng)濟、實用的一種自動識別技術。


2.1一維條碼概述

條碼可分為一維條碼(One Dimensional Barcode, 1D) 和二維碼(Two Dimensional Code, 2D)兩大類,目前在商品上的應用仍以一維條碼為主,故一維條碼又被稱為商品條碼,二維碼則是另一種漸受重視的條碼,其功能較一維條碼強,應用范圍更加廣泛。通常一個完整的條碼是由兩側空白區(qū)、起始字符、數(shù)據(jù)字符、校驗字符、終止字符組成,以一維條碼而言,其排列方式通常如表1所示:



1、空白區(qū)


位于條碼兩側無任何符號及資訊的白色區(qū)域,主要用來提示掃瞄器準備掃瞄。


2、起始字符


指條碼符號的第一位字碼,用來標識一個條碼符號的開始,掃瞄器確認此字碼存在后開始處理掃瞄脈沖。


3、數(shù)據(jù)字符


位于起始字符后面的字碼,用來標識一個條碼符號的具體數(shù)值,允許雙向掃瞄。


4、校驗字符


用來判定此次閱讀是否有效的字碼,通常是一種算術運算的結果,掃瞄器讀入條碼進行解碼時,先對讀入各字碼進行運算,如運算結果與檢查碼相同,則判定此次閱讀有效。


2.2EAN-13碼符號的特征

(1)條碼符號的整體形狀為矩形。由一系列互相平行的條和空組成,四周都留有空白區(qū)。


(2)條空分別由1-4個同一寬度的的深或淺顏色的模塊組成。深色模塊用“1”表示,淺色模塊用“0”表示。


(3)在條碼符號中,表示數(shù)字的每個條碼字符僅由兩個條和兩個空組成,共7個模塊。


(4)除了表示數(shù)字的條碼字符外,還有一些輔助條碼字符,用作表示起始、終止的分界符和平分條碼符號的中間分隔符。


(5)條碼符號可設計成既可供固定式掃描器全向掃描,又可用手持掃描設備識讀的形式。


(6)條碼符號的大小可在放大系數(shù)的兩個極限值所決定的尺寸之間變化,以適應不同印刷工藝的需求及用戶對印刷面積的要求。


(7)對一個特定大小的條碼符號所規(guī)定的尺寸稱為名義尺寸,放大系數(shù)的范圍0.8-2.0。


(8)供人識別的字符規(guī)定采用OCR-B字符。


2.3EAN-13碼符號的特征

EAN-13條碼的一個字符。條、空寬度的定義如下:圖中C1、C2、C3、C4表示每個字符中四個相鄰條、空的寬度,T表示一個字符的寬度。



設一個字符中單位模塊的寬度為n,則單位模塊的寬度:


n=T/7


T=C1+C2+C3+C4


由于條碼條、空寬度C1、C2、C3、C4已知,設條碼條、空分別占單位模塊的個數(shù)為mi,則:


mi=ci/n(其中i取1、2、3、4)


因此,由mi可知道條碼的編碼。例如:


(1)若m1=2、m2=2、m3=2、m4=1;


條碼的排列為條-空-條-空,


則可知條碼編碼為1100110,是右側偶性字符1;


(2)若m1=1、m2=2、m3=1、m4=3;


條碼的排列為空-條-空-條,


則可知條碼編碼為0110111,是右側奇性字符8。


3.MATLAB核心程序

%圖片轉(zhuǎn)換為灰度圖

if size(bar_image,3) == 3

bar_image ??????= rgb2gray(bar_image);

else

bar_image ??????= bar_image; ???

end

subplot(222);imshow(bar_image/0.5);title('原始圖像的灰度圖');

%添加噪聲

bar_image_noise = imnoise(bar_image,'salt & pepper',noise_level);

subplot(223);imshow(bar_image_noise/0.5);title('加入噪聲后的圖像');

%進行中值濾波

bar_image_filter= medfilt2(bar_image_noise,[filter_area filter_area]);

subplot(224);imshow(bar_image_filter/0.5);title('濾波之后的圖像');




%% 參數(shù)初始化

%% 參數(shù)初始化

%% 參數(shù)初始化

%二值化參數(shù)

level = 0.8;

%左邊和右邊數(shù)據(jù)編碼

codes = [3211,2221,2122,1411,1132,1231,1114,1312,1213,3112;

1123,1222,2212,1141,2311,1321,4111,2131,3121,2113];

%第一位數(shù)據(jù)編碼 ????

first_codes = [31,20,18,17,12,6,3,10,9,5]; ??

%求灰度圖的大小

[height,width] ?????= size(bar_image_filter);

%二值化參數(shù)

bar_image_filter_10 = im2bw(bar_image_filter,level);



%% 條碼檢測

%% 條碼檢測

%% 條碼檢測


%檢測59根條形碼

l = 0; ??

for i=1:height

k = 1;

l = l+1;


for j=1:width-1

%比較同一行相鄰兩點的顏色是否一致

if bar_image_filter_10(i,j)>bar_image_filter_10(i,j+1) | bar_image_filter_10(i,j)< bar_image_filter_10(i,j+1) ?

Y_position(l,k) = j; %記錄坐標

k = k+1; ???????

end

if k>61

l = l-1;

break

end

end


if k<61

l = l-1;

end

end



[height,width] = size(Y_position);


if height<=1

disp('無效的條形碼');

else

%條形碼的寬度

bar_width = func_Tiaox_width(Y_position,height,width);

%條形碼的寬度

[bar_sum2,Left_bar_number,Right_bar_number]=func_eachwidth(bar_width,height);


bar_number ?????= '';

bar_fist_number = 0;

first ??????????= 2;

%左邊編碼查出條形碼編碼

.......................................................................

end

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容