主要内容

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

此示例演示如何使用小波图像散射对纹理进行分类™, 这个例子还需要并行计算工具箱™ 图像处理工具箱™.

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

小波图像散射

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

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

KTH-TIPS

此示例使用一个公开可用的纹理数据库,即KTH-TIPS(不同照明、姿势和比例下的纹理)图像数据库[6]。此示例中使用的KTH-TIPS数据集是灰度版本。共有810个图像,其中有10个纹理,每个纹理81个图像。大多数图像的大小为200 x 200。此示例假定您已下载KTH-TIPS灰度数据集并将其取消还原,以便将10个纹理类包含在的单独子文件夹中一个公用文件夹。每个子文件夹根据其包含的纹理类别命名。取消对下载的kth_tips_Gray_200x200.tar文件足以提供顶级文件夹KTH_TIPS和所需的子文件夹结构。

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

位置= fullfile (tempdir,'kth_tips_grey_200x200'“KTH_提示”);Imds=图像数据存储(位置,“包含子文件夹”,真的,“文件扩展名”“.png”“标签源”“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=图像数据存储(位置,“包含子文件夹”,真的,“文件扩展名”“.png”“标签源”“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

创造调整大小图像的数组。

t列车=高(列车IMDS);Ttest=高(testImds);

使用InvarianceScale150股。不变性尺度超参数是我们在这个例子中设置的唯一参数。对于散射变换的其他超参数,使用默认值。

sn=小波模式2(“图像大小”(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.助手分类器.这个函数Helperpcamodel.根据散射特征确定每个数字类的主成分。代码Helperpcamodel.位于本示例的末尾。功能助手分类器对保留的测试数据进行分类,方法是在每个测试特征向量的主成分与训练集之间找到最接近的匹配(最佳投影),并相应地分配类。的代码助手分类器位于本示例的末尾。

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

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

精度=总和(testImds.Labels==predlabels)。/numel(testImds.Labels)*100
精度= 99.3750

对于测试集中的160幅图像,我们实现了99.375%的正确分类,或0.625%的错误率。混淆矩阵图显示我们的简单模型错误分类了一种纹理。

图confusionchart (testImds.Labels predlabels)

总结

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

工具书类

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

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

[3] 群不变散射纯数学和应用数学中的通信. 2012年第65卷第10期,第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/

附录 - 支持功能万博1manbetx

allowscatimages_mean.

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

Helperpcamodel.

作用Model = Helperpcamodel(功能,M,标签)%这个函数只是支持小波图像散射的例子万博1manbetx%小波工具箱。它可能会在未来的版本中更改或删除。%模型=helperPCAModel(特征、M、标签)%版权所有2018 MathWorks%初始化结构数组以保存仿射模型模型=结构('暗淡',[],“穆”,[],'U',[],'标签',分类的([]),“年代”,[]);model.dim = m;%获取类的数量标签类别=类别(标签);nclasses = numel(类别(标签));为了kk = 1:Nclasses Class = LabelCategories{kk};%查找对应于每个类的指数idxClass = label == Class;%提取每个类的特征向量tmpfeatures =特征(:,idxclass);%确定每个类的平均值model.mu{kk}=均值(tmpFeatures,2);[model.U{kk},model.S{kk}]=scatPCA(tmpFeatures);如果大小(model.U{kk},2)>M model.U{kk}=model.U{kk}(:,1:M);model.S{kk}=model.S{kk}(1:M);结尾模型标签(kk)=类别;结尾作用[u,s,v]=scatPCA(x,M)%计算沿第二维的X的主要组成部分。如果nargin> 1 && m> 0%如果M不为零,则计算前M个主分量。[u,s,v]=svds(x-sig_平均值(x),M);s=abs(诊断)/sqrt(尺寸(x,2)-1))^2;别的%否则,计算所有的主成分。%每行是观察,即散射路径的数量%每一列是一个类观察(u, d) = eig (x (x '));位于[s] =排序(诊断接头(d),“下降”);U = U(:,Ind);结尾结尾结尾

助手分类器

作用标签= helperPCAClassifier(特性,模型)%这个函数只是支持小波图像散射的例子万博1manbetx%小波工具箱。它可能会在未来的版本中更改或删除。% model是一个包含字段M、mu、v和Labels的结构数组%特征是NS-BY-L的测试数据矩阵,ns是数量%散射路径,L为测试例数。每一列的%features是一个测试示例。%版权所有2018 MathWorkslabelIdx =确定单元(功能,型号);Labels = Model.Labels(LabelIdx);%返回与imageDatastore标签一致的列向量标签=标签(:);%--------------------------------------------------------------------------作用LabelIdx =确定单元(功能,型号)%确定类的数量nclasses = numel(model.labels);初始化误差矩阵errMatrix=Inf(n类,大小(特征,2));为了nc=1:n类%类质心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=特征μ;% 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));结尾结尾结尾

也可以看看

相关话题