一、实验目的:利用灰度共生矩阵的二次统计量特征和最近邻法对纹理图像进行分类
二、实验内容:对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));%求平均分类正确率
作者:你的雷哥
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。