主要内容

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

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

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

小波图像散射

对于分类问题,将数据映射到一些替代表示通常有用的是丢弃无关信息的同时保留每个类的辨别性质。小波图像散射构成图像的低方差表示,其对翻译和小变形不敏感。由于图像中的翻译和小变形不会影响类成员资格,因此散射变换系数提供了可以构建强大的分类模型的功能。

小波散射的工作原理是通过一系列小波变换将图像级联,非线性,平均[1][3][5]。结果是特征提取是在散射变换表示中相同类中的图像在散射变换表示中彼此靠近,而属于不同类的图像进一步相距。

KTH-TIPS

这个例子使用了一个公开的纹理数据库,KTH-TIPS(不同照明、姿态和比例下的纹理)图像数据库[6]。本例中使用的KTH-TIPS数据集是灰度版本。共有810张图像,10个纹理,每个纹理81张图像。大多数图片的大小是200乘200。本例假设您已经下载了KTH-TIPS灰度数据集并将其解压缩,这样10个纹理类就包含在一个公共文件夹的独立子文件夹中。每个子文件夹都以其包含的纹理类命名。解压下载的kth_tips_grey_200x200.tarfile足以提供顶级文件夹KTH_TIPS和所需的子文件夹结构。

使用imageDatastore阅读数据。设定地点财产的imageDatastore到包含您可以访问的kth-tips数据库的文件夹。

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

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

numImages = 810;烫= randperm (numImages 20);对于NP = 1:20子图(4,5,NP)IM = IMREAD(IMDS.FILES {PUMP(NP)});ImagesC(IM);COLOROMAP.灰色的;轴;结束

纹理分类

这个例子使用MATLAB™的并行处理能力通过数组接口。如果并行池当前没有运行,则启动并行池。

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

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

rng(100) Imds = imageDatastore(location,'insertumbfolders',真的,“FileExtensions”,“使用”,“LabelSource”,“foldernames”);IMDS = Shuffle(IMDS);[训练实行,Testimds] = SpliteachLabel(IMDS,0.8);

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

CountAckeLabel(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);

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

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

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

Taurerf =聚集(训练疗法);
使用并行池“本地”评估高表达: - 通过1的1:1分钟内完成39秒评估,在1分39秒内完成
trainfeatures =猫(2,Trainf {:});Testf =收集(testfeatures);
使用并行池“本地”评估高表达: - 通过1的第1条:在23秒评估中完成,在23秒内完成
testfeatures =猫(2,Testf {:});

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

PCA模型与预测

这个例子基于每个类的散射特征向量的主成分构建了一个简单的分类器。分类器在函数中实现Helperpcamodel.helperPCAClassifier。这个函数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数据库上的最新性能相媲美。[2]

参考文献

[1] Bruna,J.和S. Mallat。“不变的散射卷积网络。”图案分析和机器智能的IEEE交易。Vol. 35, no . 8, 2013, pp. 1872-1886。

Hayman, E., B. Caputo, M. Fritz, J. O. Eklundh。《论现实世界条件对材料分类的意义》。“在计算机视觉- ECCV 2004由TomásPajdla和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页。

[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。

sfere, 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

allowscatimages_mean.

函数功能= elplerscatimages_mean(sf,x)x = imresize(x,[200 200]);smat = featurematrix(sf,x);特征=平均值(平均(Smat,2),3);结束

Helperpcamodel.

函数Model = Helperpcamodel(功能,M,标签)%这个函数只是用来支持小波图像散射的例子金宝app%小波工具箱。它可能会在未来的版本中更改或删除。% model = helperpcammodel(特性,M,标签)版权所有2018 MathWorks初始化结构数组以保存仿射模型模型=结构('暗淡',[],“亩”,[],'U',[],'标签'分类([]),“年代”,[]);model.dim = m;%获取类的数量标签类别=类别(标签);nclasses = numel(类别(标签));对于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> 0%如果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(:,Ind);结束结束结束

helperPCAClassifier

函数标签= helperPCAClassifier(特性,模型)%这个函数只是用来支持小波图像散射的例子金宝app%小波工具箱。它可能会在未来的版本中更改或删除。% model是一个包含字段、M、mu、v和标签的结构数组%特征是NS-BY-L的测试数据矩阵,ns是数量%散射路径,L为测试例个数。每一列的% features是一个测试示例。版权所有2018 MathWorkslabelIdx =确定单元(功能,型号);Labels = Model.Labels(LabelIdx);%返回列向量,以同意imageDatastore标签标签=标签(:);%--------------------------------------------------------------------------函数LabelIdx =确定单元(功能,型号)%确定类的数量nclasses = numel(model.labels);初始化误差矩阵errMatrix =正(类、尺寸(功能,2));对于数控= 1:类%类质心mu = model.mu {nc};U = model.u {nc};% 1-by-L: errMatrix (nc) = projectionError(特性、μu);结束确定沿类尺寸的最小值[~, labelIdx] = min (errMatrix [], 1);%--------------------------------------------------------------------------函数totalerr = projectionError(特性、μu)%NPC =尺寸(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:结束,:) = -abs(你'* s)。^ 2;% 1-by-Ltotalerr = sqrt(sum(err,1));结束结束结束

也可以看看

相关的话题