通过主成分分析和核支持向量机的方法对MR脑图像进行分类器设计(Matlab代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

 ⛳️赠与读者

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码、数据、文章


 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥1 概述

摘要:对MR脑图像进行自动且准确的分类对于医学分析和解释至关重要。在过去的十年中,已经提出了许多方法。本文提出了一种新方法,用于将给定的MR脑图像分类为正常或异常。该方法首先利用小波变换从图像中提取特征,然后应用主成分分析(PCA)来降低特征的维度。降维后的特征被输入到核支持向量机(KSVM)中。采用K折分层交叉验证策略来增强KSVM的泛化能力。我们选择了七种常见的脑疾病(胶质瘤、脑膜瘤、阿尔茨海默病、阿尔茨海默病加视觉失认、皮克氏病、肉瘤和亨廷顿病)作为异常脑,从哈佛医学院网站收集了160张MR脑图像(20张正常和140张异常)。我们使用了四种不同的核函数来执行我们提出的方法,并发现GRB核函数的分类准确率最高达到99.38%。LIN、HPOL和IPOL核函数的准确率分别为95%、96.88%和98.12%。我们还将我们的方法与过去十年的文献方法进行了比较,结果显示我们的DWT+PCA+KSVM方法与GRB核函数仍然取得了最佳的准确分类结果。在P4 IBM笔记本电脑上,处理一张256×256大小的图像的平均处理时间为0.0448秒,配备3 GHz处理器和2 GB RAM。根据实验数据,我们的方法既有效又快速。它可以应用于MR脑图像分类领域,并帮助医生诊断患者是否正常或异常程度。
核磁共振成像(MRI)是一种成像技术,可以产生人体解剖结构的高质量图像,特别是在大脑方面,为临床诊断和生物医学研究提供丰富信息[1-5]。MRI的诊断价值通过对MRI图像进行自动和准确分类而得以极大增强[6-8]。
小波变换是从MR脑图像中提取特征的有效工具,因为它允许根据其多分辨率分析特性在不同分辨率水平上分析图像。然而,这种技术需要大量存储空间,并且计算成本高昂[9]。为了减少特征向量的维度并增加区分能力,使用了主成分分析(PCA)[10]。PCA具有吸引力,因为它有效地降低了数据的维度,从而降低了分析新数据的计算成本[11]。然后,如何对输入数据进行分类的问题就出现了。
近年来,研究人员为实现这一目标提出了许多方法,这些方法可以分为两类。一类是监督分类,包括支持向量机(SVM)[12]和k-最近邻(k-NN)[13]。另一类是无监督分类[14],包括自组织特征映射(SOFM)[12]和模糊c-均值[15]。虽然所有这些方法都取得了良好的结果,但在分类准确性(成功分类率)方面,监督分类器表现优于无监督分类器。然而,大多数现有方法的分类准确率低于95%,因此本文的目标是找到一种更准确的方法。
 

总的来说,我们的方法包括三个阶段:
第一步:预处理(包括特征提取和特征降维);
第二步:训练核支持向量机;
第三步:将新的MRI脑图像提交给训练好的核支持向量机,并输出预测结果。
如图1所示,这个流程图是一个经典且标准的分类方法,已被证明是最佳的分类方法[22]。我们将在接下来的小节中详细解释预处理的具体步骤。
 

离散小波变换(DWT)是使用二进制尺度和位置的小波变换(WT)的强大实现方式[24]。

📚2 运行结果

部分代码:

% Classify the colors in a*b* colorspace using K means clustering.
% Since the image has 3 colors create 3 clusters.
% Measure the distance using Euclidean Distance Metric.
ab = double(lab_he(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);
nColors = 1;
[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
                                      'Replicates',1);
%[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean','Replicates',3);
% Label every pixel in tha image using results from K means
pixel_labels = reshape(cluster_idx,nrows,ncols);
%figure,imshow(pixel_labels,[]), title('Image Labeled by Cluster Index');

% Create a blank cell array to store the results of clustering
segmented_images = cell(1,3);
% Create RGB label using pixel_labels
rgb_label = repmat(pixel_labels,[1,1,3]);

for k = 1:nColors
    colors = I;
    colors(rgb_label ~= k) = 0;
    segmented_images{k} = colors;
end

%
figure, imshow(segmented_images{1});title('Objects in Cluster 1');

%figure, imshow(segmented_images{2});title('Objects in Cluster 2');

seg_img = im2bw(segmented_images{1});
figure, imshow(seg_img);title('Segmented Tumor');
%seg_img = img;
% Extract features using DWT
x = double(seg_img);
m = size(seg_img,1);
n = size(seg_img,2);
%signal1 = (rand(m,1));
%winsize = floor(size(x,1));
%winsize = int32(floor(size(x)));
%wininc = int32(10);
%J = int32(floor(log(size(x,1))/log(2)));
%Features = getmswpfeat(signal,winsize,wininc,J,'matlab');

%m = size(img,1);
%signal = rand(m,1);
signal1 = seg_img(:,:);
%Feat = getmswpfeat(signal,winsize,wininc,J,'matlab');
%Features = getmswpfeat(signal,winsize,wininc,J,'matlab');

[cA1,cH1,cV1,cD1] = dwt2(signal1,'db4');
[cA2,cH2,cV2,cD2] = dwt2(cA1,'db4');
[cA3,cH3,cV3,cD3] = dwt2(cA2,'db4');

DWT_feat = [cA3,cH3,cV3,cD3];
G = pca(DWT_feat);
whos DWT_feat
whos G
g = graycomatrix(G);
stats = graycoprops(g,'Contrast Correlation Energy Homogeneity');
Contrast = stats.Contrast;
Correlation = stats.Correlation;
Energy = stats.Energy;
Homogeneity = stats.Homogeneity;
Mean = mean2(G);
Standard_Deviation = std2(G);
Entropy = entropy(G);
RMS = mean2(rms(G));
%Skewness = skewness(img)
Variance = mean2(var(double(G)));
a = sum(double(G(:)));
Smoothness = 1-(1/(1+a));
Kurtosis = kurtosis(double(G(:)));
Skewness = skewness(double(G(:)));
% Inverse Difference Movement
m = size(G,1);
n = size(G,2);
in_diff = 0;
for i = 1:m
    for j = 1:n
        temp = G(i,j)./(1+(i-j).^2);
        in_diff = in_diff+temp;
    end
end
IDM = double(in_diff);
    
feat = [Contrast,Correlation,Energy,Homogeneity, Mean, Standard_Deviation, Entropy, RMS, Variance, Smoothness, Kurtosis, Skewness, IDM];

% Normalize features to have zero mean and unit variance
%feat = real(feat);
%feat = (feat-mean(feat(:)));
%feat=feat/std(feat(:));
%DWT_Features = cell2mat(DWT_feat);
%mean = mean(DWT_feat(:));


%feat1 = getmswpfeat(signal1,20,2,2,'matlab');

%signal2 = rand(n,1);
%feat2 = getmswpfeat(signal2,200,6,2,'matlab');

%feat2 = getmswpfeat(signal2,20,2,2,'matlab');

% Combine features
%features = [feat1;feat2];

% Apply PCA to reduce dimensionality
%coeff = pca(features);

% Check dimensionality reduction
%whos features
%whos coeff

load Trainset.mat
 xdata = meas;
 group = label;
 %svmStruct = svmtrain(xdata,group,'showplot',false);
 % species = svmclassify(svmStruct,feat)
 svmStruct1 = svmtrain(xdata,group,'kernel_function', 'linear');
 %cp = classperf(group);
 %feat1 = [0.1889 0.9646 0.4969 0.9588 31.3445 53.4054 3.0882 6.0023 1.2971e+03 1.0000 4.3694 1.5752 255];
% feat2 = [ 0.2790 0.9792 0.4229 0.9764 64.4934 88.6850 3.6704 8.4548 2.3192e+03 1.0000 1.8148 0.7854 255];
 species = svmclassify(svmStruct1,feat,'showplot',false)
 %classperf(cp,species,feat2);
 %classperf(cp,feat2);
% Accuracy = cp.CorrectRate;
% Accuracy = Accuracy*100

% Polynomial Kernel
% svmStruct2 = svmtrain(xdata,group,'Polyorder',2,'Kernel_Function','polynomial');
 %species_Poly = svmclassify(svmStruct2,feat,'showplot',false)
 
% Quadratic Kernel
%svmStruct3 = svmtrain(xdata,group,'Kernel_Function','quadratic');
%species_Quad = svmclassify(svmStruct3,feat,'showplot',false)
 
% RBF Kernel
%svmStruct4 = svmtrain(xdata,group,'RBF_Sigma', 3,'Kernel_Function','rbf','boxconstraint',Inf);
%species_RBF = svmclassify(svmStruct4,feat,'showplot',false)

% To plot classification graphs, SVM can take only two dimensional data
data1   = [meas(:,1), meas(:,2)];
newfeat = [feat(:,1),feat(:,2)];

pause
%close all

svmStruct1_new = svmtrain(data1,group,'kernel_function', 'linear','showplot',false);
species_Linear_new = svmclassify(svmStruct1_new,newfeat,'showplot',false);

%%
% Multiple runs for accuracy highest is 90%
load Trainset.mat
%data   = [meas(:,1), meas(:,2)];
data = meas;
groups = ismember(label,'BENIGN   ');
groups = ismember(label,'MALIGNANT');
[train,test] = crossvalind('HoldOut',groups);
cp = classperf(groups);
%svmStruct = svmtrain(data(train,:),groups(train),'boxconstraint',Inf,'showplot',false,'kernel_function','rbf');
svmStruct = svmtrain(data(train,:),groups(train),'showplot',false,'kernel_function','linear');
classes = svmclassify(svmStruct,data(test,:),'showplot',false);
classperf(cp,classes,test);
Accuracy_Classification = cp.CorrectRate.*100;
sprintf('Accuracy of Linear kernel is: %g%%',Accuracy_Classification)

%% Accuracy with RBF
svmStruct_RBF = svmtrain(data(train,:),groups(train),'boxconstraint',Inf,'showplot',false,'kernel_function','rbf');
classes2 = svmclassify(svmStruct_RBF,data(test,:),'showplot',false);
classperf(cp,classes2,test);
Accuracy_Classification_RBF = cp.CorrectRate.*100;
sprintf('Accuracy of RBF kernel is: %g%%',Accuracy_Classification_RBF)

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

🌈4 Matlab代码、数据、文章

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值