主要内容

基于小波图像散射的纹理分类

这个例子展示了如何使用小波图像散射对纹理进行分类。除了小波工具箱,本例还需要并行计算工具箱和图像处理工具箱。

在数字图像中,纹理提供了关于颜色或像素强度的空间排列的信息。颜色或像素强度的特定空间安排对应于被成像的物理材料的不同外观和一致性。图像的纹理分类和分割有许多重要的应用领域。一个特别重要的例子是生物医学图像分析,其中正常和病理状态通常由形态和组织学特征表征,表现为纹理[4]的差异。

小波图像散射

对于分类问题,通常有用的方法是将数据映射到一些替代表示,丢弃不相关的信息,同时保留每个类的判别属性。小波图像散射构造了对平移和小变形不敏感的低方差图像表示。由于图像中的平移和小变形不会影响类成员关系,散射变换系数提供了可以构建健壮分类模型的特征。

小波散射的工作原理是通过一系列小波变换、非线性和平均[1][3][5]级联图像。结果是特征提取是在散射变换表示中,同一类别的图像彼此移动得更近,而属于不同类别的图像之间移动得更远。

KTH-TIPS

这个例子使用了一个公开的纹理数据库,KTH-TIPS(不同照明、姿势和比例下的纹理)图像数据库[6]。本例中使用的KTH-TIPS数据集是灰度版本。总共有810张图片,10个纹理,每个纹理81张图片。大多数图像的尺寸为200x200。这个例子假设你已经下载了KTH-TIPS灰度数据集,并对其进行了解焦油处理,这样10个纹理类就包含在一个公共文件夹的单独子文件夹中。每个子文件夹以其包含的纹理类命名。解压下载的文件kth_tips_grey_200x200.tar文件足以提供顶级文件夹KTH_TIPS和所需的子文件夹结构。

使用imageDatastore读取数据。设置位置的属性imageDatastore到包含您有权访问的KTH-TIPS数据库的文件夹。

位置= fullfile(tempdir,“kth_tips_grey_200x200”“KTH_TIPS”);Imds = imageDatastore(位置,“IncludeSubFolders”,真的,“FileExtensions”“使用”“LabelSource”“foldernames”);

从数据集中随机选择并可视化20张图像。

numImages = 810;perm = randperm(numImages,20);np = 1:20 subplot(4,5,np) im = imread(Imds.Files{perm(np)});显示亮度图像(im);colormap灰色的;轴结束

纹理分类

本例使用MATLAB™的并行处理能力数组接口。启动并行池(如果当前没有运行)。

如果parpool isempty (gcp);结束
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数:6)。

为了重现性,设置随机数发生器。洗牌KTH-TIPS数据集的文件,并将810张图像分成两个随机选择的集,一个用于训练,一个用于测试。使用大约80%的图像从散射变换建立预测模型,并使用剩余的图像测试模型。

rng(100) Imds = imageDatastore(位置,“IncludeSubFolders”,真的,“FileExtensions”“使用”“LabelSource”“foldernames”);Imds = shuffle(Imds);[trainImds,testImds] = splitEachLabel(Imds,0.8);

我们现在有两个数据集。训练集由650张图像组成,每个纹理有65张图像。测试集由160张图像组成,每个纹理16张图像。要验证,请计算每个数据集中的标签。

countEachLabel (trainImds)
ans =10×2表标签数量______________ _____铝箔65棕色面包65灯芯绒65棉花65饼干65亚麻65橘皮65砂纸65海绵65泡沫聚苯乙烯65
countEachLabel (testImds)
ans =10×2表标签数______________ _____铝箔16棕色面包16灯芯绒16棉花16饼干16亚麻16橘皮16砂纸16海绵16泡沫聚苯乙烯16

创建数组用于调整大小的图像。

Ttrain =高(trainImds);Ttest = tall(testImds);

创建一个图像输入大小为200 * 200的散射框架InvarianceScale150股。不变性比例超参数是我们在本例中设置的唯一参数。对于散射变换的其他超参数,使用默认值。

sn =小波散射2(“图象尺寸”(200 200),“InvarianceScale”, 150);

为每个训练集和测试集提取分类的特征,使用helperScatImages_mean函数。的代码helperScatImages_mean在这个例子的最后。helperScatImages_mean将图像调整为普通的200 * 200大小,并使用散射框架,sn,得到特征矩阵。在这种情况下,每个特征矩阵是391 × 7 × 7。有391个散射路径,每个散射系数图像为7 × 7。最后,helperScatImages_mean沿着第2维和第3维获取平均值,为每张图像获得391个元素的特征向量。数据从40000个元素大幅减少到391个元素。

trainfeatures = cellfun(@(x)helperScatImages_mean(sn,x),Ttrain,“大学”, 0);testfeatures = cellfun(@(x)helperScatImages_mean(sn,x),Ttest,“大学”, 0);

使用收集能力,收集所有的训练和测试特征向量,并将它们连接到矩阵。

Trainf = gather(训练特征);
使用并行池“本地”评估tall表达式:-通过1 / 1:在1分39秒内完成评估
trainfeatures = cat(2,Trainf{:});Testf = gather(testfeatures);
使用并行池“本地”评估tall表达式:-通过1 / 1:在23秒内完成评估
testfeatures = cat(2,Testf{:});

前面的代码生成两个矩阵,行维数为391,列维数分别等于训练集和测试集中的图像数量。每一列都是一个特征向量。

PCA模型与预测

本例基于每个类的散射特征向量的主成分构造了一个简单的分类器。分类器在函数中实现helperPCAModel而且helperPCAClassifier.这个函数helperPCAModel根据散射特征确定每个数字类的主成分。的代码helperPCAModel在这个例子的最后。这个函数helperPCAClassifier通过在每个测试特征向量的主成分与训练集之间找到最接近的匹配(最佳投影)并相应地分配类,对保留的测试数据进行分类。的代码helperPCAClassifier在这个例子的最后。

model = helppcamodel (trainfeatures,30,trainImds.Labels);predlabels = helperPCAClassifier(testfeatures,model);

在构建模型并对测试集进行分类后,确定测试集分类的准确性。

精度= sum(testImds. sum)。标签== predlabels)./numel(testImds.Labels)*100
准确度= 99.3750

我们已经实现了99.375%的正确分类,或测试集中160张图像的错误率为0.625%。混淆矩阵的图表明,我们的简单模型错误地分类了一个纹理。

图confusionchart (testImds.Labels predlabels)

总结

在这个例子中,我们使用小波图像散射来创建用于分类的纹理的低方差表示。使用散射变换和一个简单的主成分分类器,我们在一个保留的测试集上实现了99.375%的正确分类。该结果与KTH-TIPS数据库上的最先进性能相当

参考文献

[1]布鲁娜,J.和S.马拉特。不变散射卷积网络模式分析与机器智能汇刊.第35卷,第8期,2013年,第1872-1886页。

[2]海曼,E.卡普托,M.弗里茨和J. O.埃克朗德。“论真实世界条件对材料分类的意义”在计算机视觉- ECCV 2004,由Tomás Pajdla和Jiří Matas编辑,3024:253-66。柏林,海德堡,2004年。https://doi.org/10.1007/978 - 3 - 540 - 24673 - 2 - _21。

[3]南卡罗来纳州马拉特“群不变散射。”纯粹数学与应用数学交流“,.Vol. 65, no . 10, 2012, pp. 1331-1398。

[4] Pujol, O.和P. Radeva。血管内组织表征的监督纹理分类在生物医学图像分析手册,由Jasjit S. Suri, David L. Wilson和Swamy Laxminarayan编辑,57-109。波士顿,马萨诸塞州:施普林格美国,2005年。https://doi.org/10.1007/0 - 306 - 48606 - 7 _2。

[5]西弗尔,L.和S.马拉特。“旋转,缩放和变形不变散射纹理识别。”2013年IEEE计算机视觉与模式识别会议.2013, pp 1233-1240。10.1109 / CVPR.2013.163。

[6]KTH-TIPS图像数据库主页https://www.csc.kth.se/cvap/databases/kth-tips/

附录-配套功能金宝app

helperScatImages_mean

函数features = helperScatImages_mean(sf,x) x = imresize(x,[200 200]);smat = featureMatrix(sf,x);特征= mean(mean(smat,2),3);结束

helperPCAModel

函数model = helppcamodel(特征,M,标签)此函数仅支持小波图像散射的例子金宝app小波工具箱。它可能会在未来的版本中被更改或删除。% model = helppcamodel(特征,M,标签)版权所有2018 MathWorks初始化结构数组以保存仿射模型模型= struct(“暗”[],“亩”[],“U”[],“标签”分类([]),“年代”[]);模型。Dim = M;获取类的数量LabelCategories =类别(标签);Nclasses = number(类别(标签));kk = 1:Nclasses类= LabelCategories{kk};找到每个类对应的索引idxClass =标签==类;提取每个类的特征向量tmpFeatures = features(:,idxClass);确定每个类的平均值模型。mu{kk} = mean(tmpFeatures,2);[model.U {kk},模型。S{kk}] = scatPCA(tmpFeatures);如果size(model. u {kk},2) > M型号。U{kk} = model.U{kk}(:,1:M);模型。S{kk} = model.S{kk}(1:M);结束model.Labels(kk) = Class;结束函数[u,s,v] = scatPCA(x,M)计算x沿二次元的主成分。如果nargin > 1 && M > 0如果M非零,计算前M个主成分。[u,s,v] = svds(x-sig_mean(x),M);S = abs(diag(S)/根号(size(x,2)-1)).^2;其他的%否则,计算所有主成分。每一行是一个观测值,即散射路径的数量每一列都是一个类观察值[u,d] = eig(cov(x'));[s,ind] = sort(diag(d),“下”);U = U (:,ind);结束结束结束

helperPCAClassifier

函数标签= helperPCAClassifier(特征,模型)此函数仅支持小波图像散射的例子金宝app小波工具箱。它可能会在未来的版本中被更改或删除。% model是一个结构数组,包含字段M、mu、v和Labels% features为测试数据的Ns × l矩阵,Ns为的个数%散射路径,L为测试样例数。的每一列% features是一个测试示例。版权所有2018 MathWorkslabelIdx = determineClass(特征,模型);labels = model.Labels(labelIdx);%作为列向量返回,以与imageDatastore Labels一致标签=标签(:);%--------------------------------------------------------------------------函数labelIdx = determineClass(特征,模型)确定类的数量Nclasses = numel(model.Labels);初始化错误矩阵errMatrix = Inf(Nclasses,size(features,2));nc = 1:表示Nclasses形心%Mu = model.mu{nc};u = model.U{nc};% 1-by-LerrMatrix(nc,:) = projectionError(features,mu,u);结束沿类维确定最小值[~,labelIdx] = min(errMatrix,[],1);%--------------------------------------------------------------------------函数totalerr = projectionError(特征,mu,u)Npc = size(u,2);L =尺寸(特征,2);减去类均值:Ns-by-L - Ns-by-1S = features-mu;% 1-by-LnormSqX = sum(abs(s).^2,1)';err = Inf(Npc+1,L);err(1,:) = normSqX;Err (2:end,:) = -abs(u'*s).^2;% 1-by-LTotalerr =√(sum(err,1));结束结束结束

另请参阅

相关的例子

更多关于