matlab一维条形码码字识别程序
- 格式:docx
- 大小:13.82 KB
- 文档页数:10
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);