基于SVM支持向量机的彩色图像目标分割算法matlab仿真

目录

一、理论基础

1.1 SVM

1.2 libsvm工具箱

1.3 基于SVM的图像分割

二、核心程序

三、测试结果


一、理论基础

1.1 SVM

       支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane) 。
       SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器 。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一 。

       SVM是由模式识别中广义肖像算法(generalized portrait algorithm)发展而来的分类器,其早期工作来自前苏联学者Vladimir N. Vapnik和Alexander Y. Lerner在1963年发表的研究。1964年,Vapnik和Alexey Y. Chervonenkis对广义肖像算法进行了进一步讨论并建立了硬边距的线性SVM 。此后在二十世纪70-80年代,随着模式识别中最大边距决策边界的理论研究 、基于松弛变量(slack variable)的规划问题求解技术的出现,和VC维(Vapnik-Chervonenkis dimension, VC dimension)的提出,SVM被逐步理论化并成为统计学习理论的一部分 。1992年,Bernhard E. Boser、Isabelle M. Guyon和Vapnik通过核方法得到了非线性SVM。1995年,Corinna Cortes和Vapnik提出了软边距的非线性SVM并将其应用于手写字符识别问题,这份研究在发表后得到了关注和引用,为SVM在各领域的应用提供了参考。

       基于支持向量机(Support Vector Machines,SVM)的训练学习算法,其主要原理是通过统计学理论,使得其具备以较少数量的训练数据样本来完成分类器的训练。而传统的基于神经网络的学习理论,往往需要较大数量的样本作为训练数据,因此传统的神经网络学习方法其对样本数量的依赖性较大。所以,采用SVM支持向量机的分类方法优于采用神经网络的分类方法。通过SVM支持向量机的分类算法,其首先需要对数据进行预处理,将维度较高的特征数据转换为低维度的特征数据,然后通过一个非线性映射函数产生一个对数据进行分割的超平面。因此,基于SVM支持向量机的分类算法,其本质是通过样本数据对非线性映射函数的训练和学习,从而得到适用于当前训练样本的非线性映射函数。根据实现非线性映射函数的不同方式,SVM可以分为线性可分和非线性可分两种类型。下面对这两种SVM的基本原理进行介绍。

 

 

1.2 libsvm工具箱

      LibSVM是以源代码和可执行文件两种方式给出的。如果是Windows系列操作系统,可以直接使用软件包提供的程序,也可以进行修改编译;如果是Unix类系统,必须自己编译,软件包中提供了编译格式文件,我们在SGI工作站(操作系统IRⅨ6.5)上,使用免费编译器GNU C++3.3编译通过。
使用步骤
LIBSVM 使用的一般步骤是:
1) 按照LIBSVM软件包所要求的格式准备数据集;
2) 对数据进行简单的缩放操作;
3) 考虑选用RBF 核函数;
4) 采用交叉验证选择最佳参数C与g ;
5) 采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;
6) 利用获取的模型进行测试与预测。
数据格式
LIBSVM使用的数据格式
该软件使用的训练数据和检验数据文件格式如下:
<label> <index1>:<value1> <index2>:<value2> ...
其中<label> 是训练数据集的目标值,对于分类,它是标识某类的整数(支持多个类);对于回归,是任意实数。<index> 是以1开始的整数,可以是不连续的;<value>;为实数,也就是我们常说的自变量。检验数据文件中的label只用于计算准确度或误差,如果它是未知的,只需用一个数填写这一栏,也可以空着不填。在程序包中,还包括有一个训练数据实例:heart_scale,方便参考数据文件格式以及练习使用软件。
可以编写小程序,将自己常用的数据格式转换成这种格式。其中formatdatalibsvm.xls文件可以方便的将excel数据转化为符合LIBSVM要求的数据格式。
Svmtrain使用方法
Svmtrain(训练建模)的用法:svmtrain [options] training_set_file [model_file]
Options:可用的选项即表示的涵义如下
-s svm类型:SVM设置类型(默认0)
0 -- C-SVC
1 --v-SVC
2 – 一类SVM
3 -- e -SVR
4 -- v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性:u'v
1 – 多项式:(r*u'v + coef0)^degree
2 – RBF函数:exp(-r|u-v|^2)
3 –sigmoid:tanh(r*u'v + coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
-p p:设置e -SVR 中损失函数p的值(默认0.1)
-m cachesize:设置cache内存大小,以MB为单位(默认40)
-e eps:设置允许的终止判据(默认0.001)
-h shrinking:是否使用启发式,0或1(默认1)
-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
其中-g选项中的k是指输入数据中的属性数。option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,文件中包括支持向量样本数、支持向量样本以及lagrange系数等必须的参数;该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。
Svmpredict使用方法
[predict_label, accuracy, decision_values/prob_estimates] = svmpredict(test_label, test_matrix, model, ['libsvm_options']);
-test_label:
测试标签
-testmatrix:
测试数据
-model:
训练的模型
用法如下:
modle=svmtrain(test_label,testmatrix,'libsvm_options');
[PredictLabel,accurac1] = svmpredict(test_label,testmatrix,model);
Svmpredict(使用已有的模型进行预测)的用法:svmpredict test_file model_file output_file
model_file是由svmtrain产生的模型文件;
test_file是要进行预测的数据文件;
Output_file是svmpredict的输出文件。
svm-predict没有其它的选项。
SVMSCALE 的用法
对数据集进行缩放的目的在于:1)避免一些特征值范围过大而另一些特征值范围过小;

1.3 基于SVM的图像分割

      所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。简单的说就是在一副图像中,把目标从背景中分离出来。

        使用支持向量机(SVM)实现自然图像自动分类的方法,利用区域分割方法将图像区分为前景和背景图像,进而提取前景图像的特征向量作为SVM训练样本,实现语义分类器。利用matlab中libsvm工具箱中,可以让用户利用ginput来提取背景的样本点和前景(待分割出来的目标)的样本点作为训练样本,而不需实现指定背景和前景的样本点,也不用额外的小软件来查看某点的RGB值,ginput即可。
 

二、核心程序

.............................................................
%% 建立支持向量机

% let background be 0 & foreground 1
% 即 属于背景(湖水)的点为0,属于前景(鸭子)的点位1 
TrainLabel = [zeros(length(TrainData_background),1); ...
    ones(length(TrainData_foreground),1)];

TrainData = [TrainData_background;TrainData_foreground];

model = svmtrain(TrainLabel, TrainData, '-t 1 -d 1');
%% 进行预测i.e.进行图像分割
preTrainLabel = svmpredict(TrainLabel, TrainData, model);
% 求三维矩阵pic的行数m,列数n,页数k
[m,n,k] = size(pic)
% 将三维矩阵pic转成m*n行,k列的双精度二维矩阵
TestData = double(reshape(pic,m*n,k));
% 查看矩阵TestData的大小和类型
whos TestData;
% 预测前景(鸭子)和背景(湖水)的标签
TestLabal = svmpredict(zeros(length(TestData),1), TestData, model);
%% 展示分割后的图像

% 根据预测得到的前景(鸭子)和背景(湖水)标签对整个图像的像素点进行分类,进而达到图像分割目的。
ind = reshape([TestLabal,TestLabal,TestLabal],m,n,k);
ind = logical(ind);
pic_seg = pic;
pic_seg(~ind) = 0;

% 展示分割后的图像
scrsz = get(0,'ScreenSize');
figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6  scrsz(3)*4/5 scrsz(4)]*3/4);
imshow(pic_seg);
% 分割前和分割后图像对比查看
scrsz = get(0,'ScreenSize');
figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6  scrsz(3)*4/5 scrsz(4)]*3/4);
subplot(1,2,1);
imshow(pic);
subplot(1,2,2);
imshow(pic_seg);
%%
toc;
up92

三、测试结果

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值