📄 program14.m
字号:
%%先使用腐蚀和中值滤波,并使用新的增强方法
clear
g=imread('C1.jpg');
figure(1),imshow(g);
gray=rgb2gray(g);
se=strel('square',5);
A=imerode(gray,se);
figure(2),imshow(A);
A1=medfilt2(A,[7 7]);
figure(3),imshow(A1);
tic
fun = @dct2;
B = blkproc(A1,[8 8],fun);%得到的J是和灰度图像gray一样的大小,但实际操作过程中是分块进行DCT变换的,此处的J矩阵没有补零
figure(4)
imshow(B)
B1=abs(B);%计算每个DCT块的幅值
figure(5)
imshow(B1)
t2=toc;
%%%%%%%%%%%将DCT变换后的每个幅值矩阵的(1,1)元素(即:DC分量置为0)%%%%%%%%%%%(0.33)
%%%%%%%%%%%%将DCT变换后的每个幅值矩阵除(1,1)位置的元素外,其余元素均取平均值%%%%%%%%%%%
%%%%%%%%%%%得到一个新的8x8矩阵%%%%%%%%%%%
tic
[X,Y]=size(B1);
for i=1:8:X
for j=1:8:Y
B1(i,j)=0;
end
end
C1=im2col(B1,[8 8],'distinct');%将8x8块均写成列的形式。(即矩阵C的行数为64,列数为总共分的块数,C的每一列就是一个块,按照先第一列再第二列的顺序)
Col=size(C1,2);
D1=sum(C1')/Col;%D的第i个元素是所有块的相同位置的平均值:将C的每一行元素相加
t3=toc;
%%%%%%%%%%%%将平均的DCT系数进行分类成8组(即:将相同频率的系数分成一组),得到8个一维数组%%%%%%%%%%%(本过程耗时:10.5860)
%%%%%%%%%%%%在每个频率下(即:每一个数组中找到最大值,这个最大值表明在条码区域中最强健的系数)%%%%%%%%%%%
%%%%%%%%%%%%计算8x8的权重系数矩阵,目的是:让强健的地方更加强健,削弱不强健的%%%%%%%%%%%
tic
D2=reshape(D1,[8,8]);%DCT系数的平均值矩阵
e=zeros(1,16);
w1=ones(8,8);
w=w1.*(-9);%w为权重矩阵,初始值均为-9
for k=3:9
high=0;
for i=1:(k-1)
if D2(i,k-i)>high
high=D2(i,k-i);
j1=i;j2=k-i;
end
end
w(j1,j2)=9;
end
for m=2:8
k=k+1;
high=0;
for i=m:8
if D2(i,k-i)>high
high=D2(i,k-i);
j1=i;j2=k-i;
end
end
w(j1,j2)=9;
end
w(1,1)=0;
B2 = blkproc(B,[8 8],'P1.*x',w);%让权重矩阵和每个8x8的DCT块相乘
figure(6),
imshow(B2)
t4=toc;
%%%%%%%%%%%%%计算经过乘权重矩阵w后的每一个DCT块的和,和越大的表明越接近于条码区域。%%%%%%%%%%%%(0.7310)
%%%%%%%%%%%%%DCT的和就相当于对原图像的每一个维数上以8进行采样,在后续的计算中减少了计算量%%%%%%%
tic
C2=im2col(B2,[8 8],'distinct');%一块为矩阵C2的一列
S=sum(C2);%求C2的每一列的和。即:每一个DCT块内64个加权后的系数求和
Z=S;%Z保留未改变的S值
for i=1:size(S,2)%将负值均置为0,正值均转换到0-255的范围内,去构建一个灰度图像
if S(i)<0
S(i)=0;
else
S(i)=S(i)/255;
end
end
if mod(X,8)~=0
X1=floor(X/8)+1;
else
X1=X/8;
end
if mod(Y,8)~=0
Y1=floor(Y/8)+1;
else
Y1=Y/8;
end
Z1=reshape(Z,[X1,Y1]);%未改变的块的和
S1=reshape(S,[X1,Y1]);%现在每一个块就是一个值(即:将8x8=64个值转换成一个数值),简化了计算量。在图像的两个维数上都进行了8分
figure(7),
imshow(S1)
t5=toc;
%%%%%%%%%%%%%在灰度图像中利用数学形态学的闭操作%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
se=strel('square',3);
M1=medfilt2(S1,[2 2]);%中值滤波只能取【2 2】,再大效果就不好了
figure(8),imshow(M1)
level=graythresh(M1);
T1 = im2bw(M1,level);
figure(9),imshow(T1)
%M2=medfilt2(T1,[4 4]);
%figure(10),imshow(M2)
se=strel('square',4);
M3=imdilate(T1,se);
figure(11),
imshow(M3)
M4=imfill(M3,'holes');
figure(12),imshow(M4)
%M3=imerode(M2,se);
%figure(11),imshow(M3)
%M3=medfilt2(M2,[2 2]);%在此处使用中值滤波的效果不好
%figure(10),imshow(M3)
%%%%%%%%%%%%%目的是:平滑条码区域(通常:条码区域比周围区域有更高的亮度)%%%%%%%%%%%%
%%%%%%%%%%%%%使用Otsu阈值技术将灰度图像转换成二值图像%%%%%%%%%%%%%%%%%%%%%%%%
%连接8连通区域
[N1,num]=bwlabel(M4,8);%N1为标记图像
L1=N1;%保留N1的值
for i=1:num
q=find(N1==i);
p(i)=size(q,1);
end
for i=1:num
if(p(i)==max(p))
j1=i;
end
end
for i=1:X1
for j=1:Y1
if N1(i,j)~=j1
N1(i,j)=0;
else
N1(i,j)=1;
end
end
end
figure(13),imshow(N1)
%确定为矩形
%形态学重构
h1=N1;
se=strel('square',3);
h2=(imerode(h1,se))&T1;
A=zeros(X1,Y1);
while h1~=h2
h1=h2;
h2=(imerode(h1,se))&T1;
end
figure(14),imshow(h2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -