m基于EAN13字符编码规则的一维条形码条码宽度计算和数字译码matlab仿真

188 阅读6分钟

1.算法仿真效果

matlab2022a仿真结果如下:

98350897b7344184edf0b77f2eb861b8_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

afff2d21d24ceb964bd6c2c934db3765_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png 2.算法涉及理论知识概要

       条码技术是在计算机的应用实践中产生和发展起来的一种自动识别技术,条码应用技术就是应用条码系统进行的信息处理技术。条码技术的研究始于20世纪中期,是继计算机技术应用和发展应运而生的。随着70年代微处理器的问世,标志着“信息化社会”的到来,它要求人们对社会上各个领域的信息、数据实施正确、有效、及时的采集、传递和管理。因此如何代替人的视觉、人的手工操作、或者在复杂的环境中正确、迅速地获取信息并加以识别,成为人们普遍关心和有关人员精心研究的课题。通俗的说条形码是指在浅色衬底上印有深色矩形的线条(也称条码)排列而成的编码,其码条和空白条的数量和宽度按一定的规则(标准)排列。条形码是由一组规则排列的条、空、相应的数字组成。这种用条、空组成的数据编码可以供机器识读,而且很容易译成二进制数和十进制数。这些条和空可以有各种不同的组合方法,构成不同的图形符号,即各种符号体系,适用于不同的应用场合。条码系统是由条码符号设计、制作及扫描阅读组成的自动识别系统。微电子技术和激光技术的发展使得条码识别系统越来越受到人们的关注。条码是迄今为止最经济、实用的一种自动识别技术。

 

2.1一维条码概述

       条码可分为一维条码 (One Dimensional Barcode, 1D) 和二维码(Two Dimensional Code, 2D)两大类,目前在商品上的应用仍以一维条码为主,故一维条码又被称为商品条码,二维码则是另一种渐受重视的条码,其功能较一维条码强,应用范围更加广泛。通常一个完整的条码是由两侧空白区、起始字符、数据字符、校验字符、终止字符组成,以一维条码而言,其排列方式通常如表1所示:

2a178a55ca26c78b3831aee5d5c09b49_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

1、空白区

 

       位于条码两侧无任何符号及资讯的白色区域,主要用来提示扫瞄器准备扫瞄。

 

2、起始字符

 

       指条码符号的第一位字码,用来标识一个条码符号的开始,扫瞄器确认此字码存在后开始处理扫瞄脉冲。

 

3、数据字符

 

       位于起始字符后面的字码,用来标识一个条码符号的具体数值,允许双向扫瞄。

 

4、校验字符

 

       用来判定此次阅读是否有效的字码,通常是一种算术运算的结果,扫瞄器读入条码进行解码时,先对读入各字码进行运算,如运算结果与检查码相同,则判定此次阅读有效。

 

2.2EAN-13码符号的特征

(1)条码符号的整体形状为矩形。由一系列互相平行的条和空组成,四周都留有空白区。

 

(2)条空分别由1-4个同一宽度的的深或浅颜色的模块组成。深色模块用“1”表示,浅色模块用“0”表示。

 

(3)在条码符号中,表示数字的每个条码字符仅由两个条和两个空组成,共7个模块。

 

(4)除了表示数字的条码字符外,还有一些辅助条码字符,用作表示起始、终止的分界符和平分条码符号的中间分隔符。

 

(5)条码符号可设计成既可供固定式扫描器全向扫描,又可用手持扫描设备识读的形式。

 

(6)条码符号的大小可在放大系数的两个极限值所决定的尺寸之间变化,以适应不同印刷工艺的需求及用户对印刷面积的要求。

 

(7)对一个特定大小的条码符号所规定的尺寸称为名义尺寸,放大系数的范围0.8-2.0。

 

(8)供人识别的字符规定采用OCR-B字符。

 

2.3EAN-13码符号的特征

        EAN-13条码的一个字符。条、空宽度的定义如下:图中C1、C2、C3、C4表示每个字符中四个相邻条、空的宽度,T表示一个字符的宽度。

 

f79415ae9b89332c36f777f767f2e254_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

设一个字符中单位模块的宽度为n,则单位模块的宽度:

 

n=T/7

 

T=C1+C2+C3+C4

 

由于条码条、空宽度C1、C2、C3、C4已知,设条码条、空分别占单位模块的个数为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核心程序 `%图片转换为灰度图

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('滤波之后的图像');

 

 

 

%% 参数初始化

%% 参数初始化

%% 参数初始化

%二值化参数

level = 0.8;

%左边和右边数据编码

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

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

%第一位数据编码     

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

%求灰度图的大小

[height,width]      = size(bar_image_filter);

%二值化参数

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`