主要内容

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

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

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

小波图像散射

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

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

KTH-TIPS

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

使用imageDatastore读取数据。设置位置财产的imageDatastore到包含您可以访问的KTH-TIPS数据库的文件夹。

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

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

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

纹理分类

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

如果parpool isempty (gcp);结束
使用“local”配置文件启动并行池(parpool)…连接到并行池(worker的数量:6)。

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

rng(100) Imds = imageDatastore(location,“IncludeSubFolders”,真的,“FileExtensions”“使用”“LabelSource”“foldernames”);imd = shuffle (imd);[trainImds, testImds] = splitEachLabel (imd, 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);tt =高(testImds);

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

sn = waveletScattering2 (“图象尺寸”(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), tt,“大学”, 0);

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

Trainf =收集(trainfeatures);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 1 min 39 sec
trainfeatures =猫(2,Trainf {:});Testf =收集(testfeatures);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 23 sec
testfeatures =猫(2,Testf {:});

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

PCA模型与预测

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

模型= helperPCAModel (trainfeatures 30 trainImds.Labels);predlabels = helperPCAClassifier (testfeatures模型);

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

=总和(testImds准确性。标签= = predlabels)。/元素个数(testImds.Labels) * 100
精度= 99.3750

我们对测试集中的160幅图像进行了99.375%的正确分类,错误率为0.625%。混淆矩阵的图显示我们的简单模型错误地分类了一个纹理。

图confusionchart (testImds.Labels predlabels)

总结

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

参考文献

布鲁纳J.和S.马拉特。“不变散射卷积网络”模式分析与机器智能学报.第35卷第8期,2013年,1872-1886页。

E.海曼,B.卡普托,M.弗里茨,J. O.埃克隆德。《论现实世界条件对材料分类的重要性》在计算机视觉, Tomás Pajdla和Jiří Matas编辑,3024:253-66。柏林,海德堡:施普林格柏林,海德堡,2004。https://doi.org/10.1007/978 - 3 - 540 - 24673 - 2 - _21。

[3] Mallat, S。“集团不变的散射。”纯粹和应用数学交流.第65卷第10期,2012年,1331-1398页。

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。

Sifre, L.和S. Mallat。旋转,缩放和变形不变散射用于纹理识别2013 IEEE计算机视觉与模式识别学术会议.2013年,页1233 - 1240。10.1109 / CVPR.2013.163。

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

附录-支持功能金宝app

helperScatImages_mean

函数feature = helperScatImages_mean(sf,x) x = imresize(x,[200 200]);smat = featureMatrix(科幻,x);特点=平均(平均(smat, 2), 3);结束

helperPCAModel

函数模型= helperPCAModel(特性、M标签)%这个函数只是支持小波图像散射的例子金宝app%小波工具箱。它可能会在未来的版本中更改或删除。% model = helperpcamdel(特征,M,标签)版权所有2018 MathWorks初始化结构数组以保存仿射模型模型=结构(“暗”[],“亩”[],“U”[],“标签”分类([]),“年代”[]);模型。昏暗的= M;%获取类的数量LabelCategories =类别(标签);类=元素个数(类别(标签));kk = 1:Nclasses Class = LabelCategories{kk};找到每个类对应的索引idxClass = label == Class;%提取每个类的特征向量tmpFeatures =特性(:,idxClass);确定每个类的平均值模型。μ{kk} =意味着(tmpFeatures, 2);[model.U {kk},模型。年代{kk}] = scatPCA (tmpFeatures);如果(model. u {kk},2) > M模型。U {kk} = model.U {kk} (:, 1: M);模型。年代{kk} = model.S {kk} (1: M);结束model.Labels (kk) =类;结束函数(u, v) = scatPCA (x, M)%计算x沿二维的主分量。如果nargin > 1 && M >%如果M不为零,计算前M个主成分。(u, v) =圣言(x-sig_mean (x) M);s = abs(诊断接头(s) /√(大小(x, 2) 1)) ^ 2;其他的%否则,计算所有的主成分。%每一行是一个观测值,即散射路径的数目%每一列是一个类观察(u, d) = eig (x (x '));位于[s] =排序(诊断接头(d),“下”);u = u(:,印第安纳州);结束结束结束

helperPCAClassifier

函数标签= helperPCAClassifier(特性,模型)%这个函数只是支持小波图像散射的例子金宝app%小波工具箱。它可能会在未来的版本中更改或删除。% model是一个包含字段M、mu、v和Labels的结构数组%特征为测试数据的矩阵,为n -by- l, n为%散射路径,L为测试例数。每一列的%特性是一个测试示例。版权所有2018 MathWorkslabelIdx = determineClass(特性,模型);标签= model.Labels (labelIdx);%返回与imageDatastore标签一致的列向量标签=标签(:);%--------------------------------------------------------------------------函数labelIdx = determineClass(特性,模型)%确定类的数量类=元素个数(model.Labels);初始化误差矩阵errMatrix =正(类、尺寸(功能,2));数控= 1:类%类质心μ= model.mu{数控};u = model.U{数控};% 1-by-L: errMatrix (nc) = projectionError(特性、μu);结束沿着类尺寸确定最小值[~, labelIdx] = min (errMatrix [], 1);%--------------------------------------------------------------------------函数totalerr = projectionError(特性、μu)人大=大小(u, 2);L =大小(功能,2);%减去类均值:Ns-by-L减去Ns-by-1s = features-mu;% 1-by-LnormSqX =总和(abs (s)。^ 2,1)';呃=正(人大+ 1,L);:犯错(1)= normSqX;犯错(2:,:)= abs (u ' *。^ 2;% 1-by-Ltotalerr =√sum(呃,1));结束结束结束

另请参阅

相关的例子

更多关于