matlab一维条形码码字识别程序

  • 格式:docx
  • 大小:13.82 KB
  • 文档页数:10

下载文档原格式

  / 21
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

close all

I = imread('E:\txm.jpg');

J= rgb2gray(I);

figure(1)

imshow(J);

title('灰度化图像 ');

[e1,e2]=size(J);

Im=imcrop(J,[e2/2-200,e1/2-200,400,400]); figure(2)

subplot(1,2,1),imshow(Im)

title('中心区域 ');

subplot(1,2,2),imhist(Im)

title('中心区域直方图');

[xa,ya]=size(Im);

b=double(Im);

zd=double(max(Im)) ;

zx=double(min(Im)) ;

T=double((zd+zx))/2;

count=double(0);

while 1

count=count+1;

S0=0.0; n0=0.0;

S1=0.0; n1=0.0;

for i=1:xa

for j=1:ya

if double(Im(i,j))>=T

S1=S1+double(Im(i,j));

n1=n1+1;

else

S0=S0+double(Im(i,j));

n0=n0+1;

end

end

end

T0=S0/n0;

T1=S1/n1;

if abs(T-((T0+T1)/2))<0.1

break;

else

T=(T0+T1)/2;

end

end

count

T

K=find(J

J(K)=0;

K=find(J>=T);

J(K)=255;

figure(3)

imshow(J)

title(' 图像二值化 ');

B=medfilt2(J,[5,1]);

figure(4)

imshow(B)

title('中值滤波后图像');

[y0,x0]=size(B);

BW = edge(B,'log');

figure(5);imshow(BW);title('边缘检测图像')

%function code = barcode(pic) %条形码识别

check_left = [13,25,19,61,35,49,47,59,55,11;... %左边数据编码,奇39,51,27,33,29,57, 5,17, 9,23]; %左边数据编码,偶

check_right = [114,102,108,66,92,78,80,68,72,116]; %右边数据编码first_num = [31,20,18,17,12,6,3,10,9,5];%第一位数据编码

bar = imread('E:\txm.jpg');%读输入条形码图片

bar_Gray = rgb2gray(bar);%将RGB图片转换灰度图

[a_hist x] = imhist(bar_Gray);

hist_max = [];

if a_hist(1)>a_hist(2)

hist_max = [hist_max 1];

end

x = max(x);

for i=2:x

if a_hist(i)>a_hist(i-1) && a_hist(i)>a_hist(i+1)

hist_max = [hist_max i];

end

end

if a_hist(x)

hist_max = [hist_max x+1];

end

[m,n] = size(hist_max);

k = 0;

max_1 = 0;

max_2 = 0;

for i=1:n

if k

k = a_hist(hist_max(i));

max_1 = hist_max(i);

end

end

temp = a_hist(max_1);

a_hist(max_1) = 0;

k = 0;

for i=1:n

if k

k = a_hist(hist_max(i));

max_2 = hist_max(i);

end

end

a_hist(max_1) = temp;

if max_1>max_2

k = max_1;

max_1 = max_2;

max_2 = k;

end

T = max_1;

k = a_hist(max_1);

for i=max_1:max_2

if k>a_hist(i)

k = a_hist(i);

T = i;

end

end

[m,n] = size(bar_Gray); %求灰度图的大小for i=1:m %对图像进行二值化处理

for j=1:n

if bar_Gray(i,j)>T%选择适当的阈值进行二值化处理

bar_10(i,j) = 1;

else

bar_10(i,j) = 0;

end

end

end

%imshow(bar_10);

l = 0;%检测59根条形码

for i=1:m

k = 1;

l = l+1;

for j=1:n-1

if bar_10(i,j)~=bar_10(i,j+1)%比较同一行相邻两点的颜色是否一致%bar_x(l,k) = i;

bar_y(l,k) = j; %记录转折点的纵坐标

k = k+1;%准备记录下一个数据点

end

if k>61 %点数大于60,该行应该删掉

l = l-1;

break

end

end

if k<61 %点数小于60,该行应该删掉

l = l-1;

end

end

[m,n] = size(bar_y);