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