一、實驗目的:利用灰度共生矩陣的二次統計量特征和最近鄰法對紋理圖像進行分類
二、實驗內容:對8類紋理圖像利用灰度共生矩陣的二次統計量特征和最近鄰法進行分類,其中每類紋理圖像有8幅,總共64幅,每幅圖像的大小為200x200。實驗中將各類紋理圖像樣本按數量隨機等分成兩部分作為訓練、測試樣本集,按照這種方式運行10 次對結果求平均平均分類正確率。觀察不同的灰度共生矩陣對分類正確率的影響。用到的matlab函數為strcat,randperm,int2str,graycomatrix,graycoprops。
四、實驗方法
(1)計算訓練樣本集中每幅圖像的共生矩陣;
(2)根據訓練樣本集中每幅圖像的共生矩陣計算對比度、相關性、能量、均勻度和熵的值,把這些值形成一個特征向量xi,i=1,2, …,N,N是訓練樣本個數;
(3)對於測試圖像計算其共生矩陣;
(4)根據測試圖像的共生矩陣計算對比度、相關性、能量、均勻度和熵的值,把這些值形成一個特征向量x;
(5)采用最近鄰法對測試圖像進行分類;
(6)輸出分類結果。
五、實驗圖片說明:實驗圖片名稱的第一個數字表示類別,第二個數字表示該類的第幾幅圖像
六、實驗報告要求:
(1)寫出實現本次實驗內容的程序
(2)對程序作出注釋
(3)寫出實驗中灰度共生矩陣的量化級數,d的取值,方向的取值及所得到的紋理圖像的識別率
1 clc,clear,close all; 2 percent=[];%正確率數組 3 for n=1:10 4 train=[];test=[]; 5 index=0;%測試集下標 6 for i=1:8 7 P=randperm(8);%隨機序列 8 for j=1:4 9 train{i,j}=strcat(int2str(i),int2str(P(j)),'.jpg');%隨機訓練集 10 end 11 for j=5:8 12 index=index+1; 13 test{index}=strcat(int2str(i),int2str(P(j)),'.jpg'); %隨機測試集 14 end 15 end 16 [M,N]=size(train);%訓練集大小 17 X=[]; 18 for i=1:M 19 for j=1:N 20 name=char(train(i,j)); 21 img_train=imread(name);%讀取訓練集圖片 22 glcm=graycomatrix(img_train,'Offset',[-1 -1],'NumLevels',4);%計算灰度共生矩陣,135度方向,d=1,量化級數4 23 stats = graycoprops(glcm, 'all');%計算對比度、相關、能量、均勻度 24 out= entropy(img_train); %計算出整幅圖的熵 25 X(i,j,:)=[stats.Contrast,stats.Correlation,stats.Energy,stats.Homogeneity,out];%訓練集特征向量 26 end 27 end 28 truenum=0; 29 for i=1:index 30 x=[]; 31 name=char(test(i)); 32 img_test=imread(name);%讀取測試集圖片 33 glcm=graycomatrix(img_test,'Offset',[-1 -1],'NumLevels',4);%計算灰度共生矩陣,135度方向,d=1,量化級數4 34 stats = graycoprops(glcm, 'all');%計算對比度、相關、能量、均勻度 35 out= entropy(img_train); %計算出整幅圖的熵 36 x=[stats.Contrast,stats.Correlation,stats.Energy,stats.Homogeneity,out];%測試集特征向量 37 gix=[]; 38 for j=1:M 39 odist=[];%第j類的歐式距離數組 40 for k=1:N 41 a=X(j,k,:); 42 a=a(:)';%訓練集特征向量 43 odist(k)=norm(a-x);%求歐氏距離 44 end 45 gix(j)=min(odist);%第j類中最小歐氏距離 46 end 47 [gjx,mindex]=min(gix);%最小歐氏距離及其類別 48 fprintf('%s屬於第%d類 ',name,mindex); 49 if mod(i,4)==0 50 fprintf('\n');%每四個換一次行 51 end 52 num=str2num(name(1));%正確的類別 53 if num==mindex 54 truenum=truenum+1;%求分類正確的數量 55 end 56 end 57 percent(n)=truenum/32;%求分類正確率 58 fprintf('正確率為:%f\n',percent(n)); 59 end 60 fprintf('10次平均正確率為:%f\n',mean(percent));%求平均分類正確率