?? 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 + -