www.pudn.com > codebar.rar > codebarreg.m


%方法二:按照书本上所说的,采用这种方法锐化可以减低噪声,并且可以达到目的 
clear;clc; 
close all; 
I=imread('w7.bmp');%IMG_left_0comexple.bmp/b10_1 w2.bmp 
I1 = rgb2gray(I); 
figure,imshow(I1);title('original img'); 
 
%%%%---------------------(1) 边缘检测------------------------%%%%% 
%为了读取边缘区域,prewitt算法比roberts算法得到的边界更为清楚 
%I2=edge(I1,'sobel');经过比较sobel,prewitt算法,在防止噪声方面sobel比较好 
%但是sobel的过滤的信息比较多,故采用prewitts算法 
I2 = edge(I1,'prewitt',0.04);%roberts 
%I2 = edge(I1,'sobel'); 
%figure,imshow(I2),title('prewitt边缘检测'); 
[height,width]=size(I2); 
%[stlst,endlst,stlen,endlen] = ImageEdgePoint(I2,height,width); 
[stlst,endlst,len,Vpixel,Hpixel] = ImageEdgePoint(I2,height,width); 
 
%%%%过滤掉水平投影点数小于4的行,因为条形码区域水平投影点数一般不会小于4个%%% 
for k=1:height 
    if(Vpixel(k,1) < 10)%鉴于条形码边界横向的点数相对稳定,故大胆剪切 
        stlst(k,1) = 0; 
        endlst(k,1) = 0; 
        Vpixel(k,1) = 0; 
    end 
end 
%%%%过滤掉垂直投影点数小于6的列,因为条形码区域垂直投影点数一般不会小于6个%%% 
for k=1:width 
    if(Hpixel(k,1) < 4) 
        endlst(k,1) = 0; 
        stlst(k,1) = 0; 
        Hpixel(k,1) = 0; 
    end 
end 
%%----------------------(2) 剪切条形码区域-------------------------%%% 
threthold = 10;%去步长 
%[sslope,spy,sny,slpara] = point2line(threthold,stlst,height,stlen);%起始边的属性 
%[eslope,epy,eny,elpara] = point2line(threthold,endlst,height,endlen);%终止边的属性 
[sslope,skeyY,slpara] = point2line(threthold,stlst,height,len(1));  %起始边的属性 
[eslope,ekeyY,elpara] = point2line(threthold,endlst,height,len(2)); %终止边的属性 
stcount = skeyY(4);%skeyY(3); 
endcount = ekeyY(4);%ekeyY(3); 
spx = [stlst(skeyY(1)) stlst(skeyY(2))];    %斜率为正的起始点1、起始点2,spx2 = startY(spy(2)); 
epx = [endlst(ekeyY(1)) endlst(ekeyY(2))];  %斜率为正的终止点1、终止点2,epx2 = endY(epy(2)); 
%snx = [stlst(sny(1)) stlst(sny(2))]; 
%enx = [endlst(eny(1)) endlst(eny(2))];%enx2 = endY(eny(2)); 
%%%%%%%%%%-----条形码边界存在边界,但是斜率并不是完全一致------%%%%%%%%% 
%sy = slpara(1)*sx + slpara(2);y = Sk*x+Sa; 
%ssy = (-1/slpara(1))*(ssx-spx(1)) + spy(1);%在(spx1,spy1)处直线sy的法线 
%ey = elpara(1)*ex + elpara(2); y = Ek*x+Ea;          %与法线求交点 
%if(sslope ~= eslope) 
 
if((stcount-endcount)>0) 
    K=sslope(1);  
    Sk=slpara(1); Sa=slpara(2); 
    Ek=elpara(1);Ea=elpara(2); 
    y1=skeyY(1);x1=spx(1); 
    y2=skeyY(2);x2=spx(2); 
    r_y1=ekeyY(1);r_x1=epx(1);%已知点 
    r_y2=ekeyY(2);r_x2=epx(2); 
else 
    K=eslope(1);  
    Sk=elpara(1);Sa=elpara(2); 
    Ek=slpara(1);Ea =slpara(2); 
    y1=ekeyY(1);x1=epx(1); 
    y2=ekeyY(2);x2=epx(2); 
    r_y1=skeyY(1);r_x1=spx(1);%已知点 
    r_y2=skeyY(2);r_x2=spx(2); 
end 
if(K==0) 
    x1_x = epx(1); 
    x2_x = spx(1); 
    y1_y = y1; 
    y2_y = y2; 
else 
    x1_x = (y1*Sk-Ea*Sk+x1)/(1 + Ek*Sk);%交点 
    y1_y = Ek*x1_x + Ea;    %604 
    x2_x = (y2*Sk-Ea*Sk+x2)/(1 + Ek*Sk); 
    y2_y = Ek*x2_x + Ea;%649 
end 
up = min([y1 y1_y y2 y2_y r_y1 r_y2]);%由于根据拟合的直线不是很标准,故计算出来的up值有可能为负值 
bottom = max([y1 y1_y y2 y2_y r_y1 r_y2]); 
left = min([x1 x1_x x2 x2_x r_x1 r_x2]); 
right = max([x1 x1_x x2 x2_x r_x1 r_x2]); 
 
up_t = round(up); 
bottom_t = round(bottom); 
left_t = round(left); 
right_t = round(right); 
%I2 = imcrop(I1,[left_t up_t (right_t-left_t) (bottom_t-up_t)]);%I 
I2 = imcrop(I1,[1 up_t (width-1) (bottom_t-up_t)]);%I 
figure, imshow(I2),title('图像剪切1'); 
 
[h0,w0]=size(I2); 
[threthold] = ThretholdOptimize(I2,h0,w0); 
II=im2bw(I2,threthold/256);%先二值化180,%人为的定义划分值为200,这样的灵活性差? 
%figure, imshow(II),title('阀值'); 
 
alpha = atand(K);%atand(eslope(1)); 
if(alpha ~= 0) 
    I3 = imrotate(I2,-alpha,'bilinear');%bilinear,nearest,bicubic;loose,crop 
    figure,imshow(I3),title('角度校正'); 
else 
    I3 = I2; 
end 
[height,width]=size(I3); 
diff = abs(K*h0);%旋转造成的冗余量,左右边都有。 
II3 = imcrop(I3,[diff 1 (width-2*diff) (height-1)]);%I 
%figure, imshow(II3),title('图像剪切2'); 
 
%%------------------------(3) 进一步剪切---------------------------%%% 
I4=im2bw(II3,threthold/256);%先二值化180,%人为的定义划分值为200,这样的灵活性差?->大津算法 
%figure, imshow(I4),title('BW3'); 
[height,width]=size(I4); 
[left,up,right,down] = imagefilter(I4,width,height); 
if((right-left>1)&&(down-up>1)) 
    I5 = imcrop(II3,[left up (right-left) (down-up)]);%I 
    figure, imshow(I5),title('真正的条形码区域'); 
else 
    I5 = II3; 
end 
 
%%%--------------------------(4)图像增强----------------------------%%% 
w8=[1 1 1; 1 -8 1; 1 1 1]; 
g8=I5-imfilter(I5,w8,'replicate'); 
%figure,imshow(g8),title('拉普拉斯锐化后与原图叠加的图像'); 
%%锐化一次就可以了,锐化两次效果不见得更好%% 
I6=imadjust(g8,[0.1 0.7], [0 1]);%光提高亮度还不行,关键还要锐化 
%figure, imshow(I6),title('Lap锐化后提高亮度后图像');  
[h1,w1]=size(I5); 
[I7,T] = histeq(I5);    %直方图均匀化增强 
figure,imshow(I7),title('直方图均匀化增强图像');%BW1 = edge(J,'roberts');  %%为梯度阈值,0.04%BW1 = edge(I2,'prewitt',0.1,'horizontal'); 
I8=imadjust(I7,[0.1 0.7], [0 1]);   %光提高亮度还不行,关键还要锐化 
%figure, imshow(I8),title('直方图均匀化后提高亮度图像');  
 
%%%--------------------------(5) 缩小图像----------------------------%%% 
I9 = imresize(I6,[h1 220],'bilinear'); 
figure,imshow(I9),title('拉普拉斯图像缩小'); 
I10 = imresize(I8,[h1 220],'bilinear'); 
figure,imshow(I10),title('直方图图像缩小'); 
 
%%%%%%%-----分割图像-----%%%%%%% 
[h1,w1]=size(I9); 
[th0] = ThretholdOptimize(I9,h1,w1); 
I11=im2bw(I9,th0/256);%人为的定义划分值为200,这样的灵活性差 
figure,imshow(I11),title('Lap图-二值化'); 
[th1] = ThretholdOptimize(I10,h1,w1); 
I12=im2bw(I10,th1/256);% 
figure,imshow(I12),title('直方图-二值化'); 
%%%-------------------------(6) 条形码识别-----------------------------%%% 
[height,width]=size(I12); 
number=0; 
[number,I13]=barcognition(I12,height,width); 
%%%%%%%%%%%%%%%%%%%%------------基于矩不变量的二阀值算法--------------%%%%%%%%%%%%%%%%% 
%%%----------分割区域--------%%% 
[height,width]=size(I9); 
hist=zeros(1,256); 
for i=1:1:height                 %计算直方图 
    for j=1:1:width 
        fi=I9(i,j); 
        hist(fi+1)=hist(fi+1)+1; 
    end 
end 
p=zeros(1,256); 
for i=1:1:256               %计算每个灰度出现的概率 
    p(i)=hist(i)/(height*width); 
end 
%%%%%----计算图像的各阶矩-----%%%% 
m0=0;m1=0;m2=0;m3=0; 
for i=1:1:256 
    m0 = m0 + p(i);         %0阶 
    m1 = m1 + (i-1)*p(i);   %1阶 
    m2 = m2 + (i-1)^2*p(i); %2阶 
    m3 = m3 + (i-1)^3*p(i); %3阶 
end 
%%%%-----解方程,计算阈值----%%%% 
ms=m2-m1^2; 
a0=(m1*m2-m3)/ms; 
a1=(m1*m3-m2^2)/ms; 
k=0.5*((a0^2-4*a1)^0.5-a0); 
p0=(k-m1)/(a0^2-4*a1)^0.5; 
pp=0; 
for i=1:1:256 
    pp=pp+p(i); 
    if(pp>p0) 
        th=i; 
        break; 
    end 
end 
%%%%%%%-----分割图像-----%%%%%%% 
I11=im2bw(I9,th/256);% 
figure,imshow(I11),title('I11'); 
 
h1=[-1 -2 -1;0 0 0;1 2 1]; 
h2=[1 1 1;1 -8 1;1 1 1]; 
h3=[1 1 1;1 -9 1;1 1 1]; 
A=-1; 
h4=[1 1 1;1 -A-8 1;1 1 1]; 
I4=im2double(I3);   %转化为小数类型,注转化为小数时图形就产生了变化 
g51=imfilter(I4,h2);%拉普拉斯 
figure,imshow(g51);title('g51-拉普拉斯'); 
i52=imadd(I4,g51); 
figure,imshow(i52);title('原图与拉普拉斯锐化叠加图像'); 
H = fspecial('sobel'); 
SOBEL=imfilter(I4,H); 
i53=imadd(I4,SOBEL); 
figure,imshow(i53);title('SOBEL处理'); 
H = fspecial('average',[5 5]);      %生成一5×5邻域平均窗函数 
g53=filter2(H,i53);                 %求邻域平均 
figure,imshow(g53);title('5*5均值滤波平滑的sobel图像'); 
 
i523=immultiply(i53,i52); 
figure,imshow(i523);title('i52*53'); 
i524=imadd(I4,i523); 
figure,imshow(i524);title('i5与i52*i53相加'); 
I5 = im2uint8(i524);        %转化为整数类型,与im2double相互对应 
 
 
space = linspace(1,256,256); 
figure,plot(space,p); 
BW3=im2bw(I3,50/256);% 
figure,imshow(BW3),title('BW3'); 
arPixelV = zeros(y,1); 
arPixelH = zeros(x,1); 
height = y; 
width = x; 
[Iout] = imageprocess(BW3,width,height); 
%[stlist,endlist,arPixelH,arPixelV] = ImageAnalyzing(I,height,width) 
[startY,endY,arPixelH,arPixelV] = ImageAnalyzing(Iout,height,width);