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);