MATLAB — 利用SVM(支持向量机)进行图像分割/提取

1. 思路

本周的作业,老师的要求是使用支持向量机提取印章图像。

一张图像可以通过RGB三个通道的颜色叠加得到完整的彩色图像。 考虑到图像的这种特性,可以选择将一个像素点的三个通道值作为训练数据,通过标注的方法将每组数据所代表的特征表示出来(如,表示印章的像素点为1,表示其它区域的像素点为0),再使用支持向量机对标注的数据进行训练,并将训练好的模型运用到整张图片上,即可得到预测结果。对于模型的预测准确度,有三个主要影响因素,一是参数的选择,二是训练数据点的位置是否合理,三是数据集的数量是否充足。

本程序选择v-SVC类型、线性核函数、degree = 3、cost = 1000等一并作为参数,每次预测都准备了40个训练数据(其中图像提取点和背景点各20个),并通过不同的情况对模型效果进行验证。

另外,本程序需要使用libsvm工具箱作为支持,需要提前安装libsvm工具箱并将工具箱文件夹添加到matlab的路径中。

2. 实际运行效果

训练点集选择位置:
红圈为选择的背景点,红色*号为印章位置:

提取出的图像二值化效果
在这里插入图片描述
提取出的图像结果
在这里插入图片描述

3. 引申

对于计算机来说,其实看不到印章具体的颜色,而是是通过RGB三个通道的数值及其对应的特征进行训练和预测的,因此我们可以考虑将应用场景拓展到提取其它具有明显特征的物品的情况,如日历、书籍、文具、文字等,也可以拓展到在背景色与需要提取的物体有较明显色差的情况,及可以同时提取两个及以上物体的情况。
以下展示一些其它提取的结果,毕竟支持向量机的分类运用场景相对局限,我也懒得改参数优化,所以下面颜色过于复杂的情况会导致提取效果变差。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 源代码

%% 初始化
clc
clear
close all

%% 预读图片与数据处理
pic = imread('./yinzhang_train/tuozhan3.jpg');
figure(1)
imshow(pic)

% 数据归一化处理
% 提取pic的size
[m,n,k] = size(pic);
% 将pic重组为一维数组好进行归一化处理
pic1 = double(reshape(pic, m*n*k, 1));
% 将数组归一化
pic11 = mapminmax(pic1, 0, 1);
% 还原三维数数组,作为最终的归一化结果值
pic_fin = double(reshape(pic11, m, n, k));

%% 采集数据并确定数据集
% 创建空的数据集等待输入
% 印章的训练集
train_yinzhang = zeros(20, 3); 
% 背景的训练集
train_background = zeros(20, 3);

% 图片采样
% % 记录x,y数组数据(仅用于调试)
% x_y = zeros(40, 2);
% x_y1 = zeros(40, 2);

% 印章点采样
msgbox('请选择20个提取点作为训练数据,按空格开始选择','Background Samples','help');
pause;
for run = 1:20
    %使用ginput函数直接提取像素点
    [x,y] = ginput(1); 
%     x_y(run,:) = [x y];
    hold on;
    %标出选择点的位置
    plot(x, y, 'r*');
    x = floor(x);
    y = floor(y);
%     x_y1(run,:) = [x y];

    % 记录提取点所在rbg通道的归一化值
    train_yinzhang(run, 1) = pic_fin(y, x, 1);
    train_yinzhang(run, 2) = pic_fin(y, x, 2);
    train_yinzhang(run, 3) = pic_fin(y, x, 3);
end 

% 背景点采样
msgbox('请再选择20个背景点作为训练数据,按空格开始选择','Foreground Samples','help');
pause;
for run = 1: 20
    [x,y] = ginput(1);
%     x_y(run+20,:) = [x y];
    hold on;
    plot(x, y, 'ro');
    x = floor(x);
    y = floor(y);
%     x_y1(run+20,:) = [x y];

    % 记录背景点所在rbg通道的归一化值
    train_background(run, 1) = pic_fin(y, x, 1);
    train_background(run, 2) = pic_fin(y, x, 2);
    train_background(run, 3) = pic_fin(y, x, 3);
end

%% 时间记录
tic;

%% 训练数据
% 训练集
train_data = [train_yinzhang; train_background];

% 点对应的标签
train_label = [ones(length(train_yinzhang), 1); zeros(length(train_background), 1)];

% 支持向量机参数设置
opt = ['-d 1 -s 1 -t 1 -c 1000'];

% 构建训练模型
model = svmtrain(train_label, train_data, opt);

%% 预测数据
% 预训练找到较高的预测精度的参数后再进行下一步
prelabel = svmpredict(train_label, train_data, model)

% 数据训练数据集处理(将三维数组转换为二维数组方便对每个像素点进行预测)
TestData = double(reshape(pic_fin, m*n, k));

% 预测数据(此处预测精度没有参考意义)
TestLabel = svmpredict(zeros(m*n,1), TestData, model);
disp('注意:最后一个accuracy精度不具有参考意义,仅能代表识别出的图像占原图像的比例')

%% 输出图像
% 重组结果
black_white = reshape(TestLabel,m,n);

% 输出二值图像
figure(2)
imshow(black_white);

% 输出提取的彩色图
color = reshape([TestLabel,TestLabel,TestLabel],m,n,k);
color = logical(color);
pic_seg = pic;
pic_seg(~color) = 0;
figure(3);
imshow(pic_seg);

% 输出对比图
figure(4);
subplot(1,3,1);
imshow(pic);
subplot(1,3,2);
imshow(pic_seg);
subplot(1,3,3);
imshow(black_white);

%% 时间记录
toc;

  • 13
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: 使用MATLAB进行支持向量机SVM)的遥感图像分类,可以按照以下步骤进行: 1. 数据预处理:在进行分类之前,首先需要对遥感图像数据进行预处理。这包括读取图像文件、裁剪图像区域(如果需要)和提取图像特征等。 2. 特征提取:根据遥感图像的特点,选择适当的特征提取方法。常用的特征包括灰度直方图、梯度直方图、纹理特征等。通过MATLAB提供的图像处理工具箱中的函数,可以方便地提取这些特征。 3. 数据准备:将特征向量和对应的类别标签整理成训练数据集和测试数据集。训练数据集用于训练SVM模型,而测试数据集用于评估模型的性能。 4. 训练SVM模型:使用MATLAB中的SVM函数,例如fitcsvm或fitcecoc,对训练数据集进行训练。可以根据具体的分类任务和问题进行参数的调整,包括核函数的选择、惩罚参数C的设置等。 5. 模型评估:使用测试数据集对训练好的SVM模型进行评估。可以通过计算分类准确率、精确率、召回率等指标来评估模型的性能。 6. 可视化结果:根据需要,使用MATLAB绘图函数,如scatter和imshow等,将分类结果可视化显示。 整个过程中,MATLAB提供了丰富的函数和工具箱,可大大简化支持向量机的实现过程。根据具体的遥感图像分类问题,需要灵活运用MATLAB的相关函数和算法,进行代码的编写和调试。 以上是一个简要的回答,如果需要更加详细和具体的代码示例,可以提供更多相关信息,以便更好地指导编写。 ### 回答2: 遥感图像分类是遥感科学中的重要任务之一,支持向量机(Support Vector Machine, SVM)是常用的分类算法之一。下面是用MATLAB编写的遥感图像分类的SVM代码,步骤如下: 1. 加载遥感图像数据。使用MATLAB中的imread函数读取遥感图像数据,将其转换成数据矩阵。 2. 准备训练样本数据和标签。根据具体的遥感图像分类任务,选择一部分图像作为训练样本,并为每个样本标注对应的类别。 3. 对样本数据进行预处理。根据具体的需求,对样本数据进行预处理操作,如特征提取、降维等。可以使用MATLAB中的图像处理工具箱和机器学习工具箱功能实现。 4. 训练SVM分类器。使用MATLAB中的fitcsvm函数建立SVM分类器模型,将训练样本数据和标签作为输入。根据需要,可以设置SVM模型的参数,如核函数类型、惩罚系数等。 5. 对遥感图像进行分类预测。使用训练好的SVM分类器对未知的遥感图像数据进行分类预测。可以使用MATLAB中的predict函数进行预测,并将预测结果保存下来。 6. 对分类结果进行评估。根据实际情况使用合适的评估指标(如准确率、召回率等)对分类结果进行评估,并记录评估结果。 这是一个简单的遥感图像分类的SVM代码框架,具体实现还需要根据实际的数据和任务进行调整和优化。同时,还可以考虑其他的图像分类算法,如卷积神经网络(Convolutional Neural Network, CNN)等,以提高分类的准确性和鲁棒性。 ### 回答3: 使用MATLAB进行支持向量机SVM)的遥感图像分类,需要遵循以下步骤: 1. 数据准备:将遥感图像转换为可供分类的特征向量格式。可以选择提取常见的遥感特征,如纹理特征,颜色特征,形态特征等。将这些特征提取为特征向量,并将其与标签数据(即每个样本对应的类别)一起准备好。 2. 数据预处理:对特征向量进行预处理,例如归一化。这可以提高SVM分类器的性能。 3. 数据划分:将数据集划分为训练集和测试集,用于模型的训练和评估。 4. SVM模型的训练:使用MATLAB内置的svmtrain函数来训练SVM模型。需要指定SVM的参数,例如核函数类型(线性、多项式、径向基函数等)以及相应的参数(如多项式的阶数、径向基函数的宽度等)。 5. 模型的评估:使用测试集来评估SVM模型的分类性能。可以使用MATLAB内置的svmclassify函数来对测试集样本进行分类,并与真实标签进行比较。 6. 结果可视化:根据分类结果,可以使用MATLAB内置的图像处理和图像分割函数,将分类结果可视化在原始遥感图像上,以便进行结果的验证和可视化分析。 需要注意的是,SVM是一个强大的分类算法,但正确选择并优化参数对于模型性能至关重要。此外,对于大规模的遥感图像分类问题,可能需要考虑使用基于SVM的快速算法或分布式计算方法,以便更高效地进行分类任务。 总之,以上是使用MATLAB进行遥感图像分类的一般步骤。具体的代码实现可以根据具体任务和数据集的特点进行定制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值