基于SVM的图像分割MATLAB实现实例

简介: 实例演示如何使用支持向量机(SVM)对自然图像进行二值分割(前景与背景分离)。以鸭子图像分割为例,通过RGB颜色特征训练SVM模型,实现从湖水背景中提取鸭子区域。

一、应用场景

实例演示如何使用支持向量机(SVM)对自然图像进行二值分割(前景与背景分离)。以鸭子图像分割为例,通过RGB颜色特征训练SVM模型,实现从湖水背景中提取鸭子区域。


二、核心步骤与代码实现

1. 数据准备与特征提取
  • 输入图像:读取RGB图像,转换为双精度矩阵。
  • 训练样本选择:手动标注前景(鸭子)和背景(湖水)的像素点,提取RGB值作为特征。
%% 读取图像
pic = imread('littleduck.jpg'); % 替换为实际图像路径
[m, n, k] = size(pic); % 图像尺寸

%% 手动标注训练样本(示例数据)
% 背景样本(湖水)
TrainData_background = [
    52 74 87; 76 117 150; 19 48 62; 35 64 82; 46 58 36;
    50 57 23; 110 127 135; 156 173 189; 246 242 232; 166 174 151
]'; % 10个样本,每列[R, G, B]

% 前景样本(鸭子)
TrainData_foreground = [
    211 192 107; 202 193 164; 32 25 0; 213 201 151; 115 75 16;
    101 70 0; 169 131 22; 150 133 87
]'; % 8个样本,每列[R, G, B]

%% 构建训练集与标签
TrainLabel = [zeros(size(TrainData_background,2),1); ones(size(TrainData_foreground,2),1)];
TrainData = [TrainData_background, TrainData_foreground];

2. SVM模型训练
  • 核函数选择:线性核(-t 1)适用于线性可分场景,RBF核(-t 2)适用于非线性问题。
  • 参数设置:惩罚系数C控制分类误差容忍度,-d 1指定多项式核阶数(线性核无需设置)。
%% 训练SVM模型(使用LIBSVM工具箱)
model = svmtrain(TrainLabel, TrainData, '-t 1 -d 1 -c 1'); % 线性核,C=1

3. 图像分割与预测
  • 像素级预测:将图像重塑为二维矩阵,逐像素分类。
  • 生成分割掩码:根据预测标签重构二值图像。
%% 预测图像像素类别
TestData = double(reshape(pic, m*n, k)); % 转换为二维特征矩阵
[predict_label, accuracy, dec_values] = svmpredict(zeros(size(TestData,1),1), TestData, model);

%% 生成分割掩码
seg_mask = reshape(predict_label, m, n); % 重塑为图像尺寸
seg_img = pic; % 初始化分割图像
seg_img(~seg_mask) = 0; % 背景置零

4. 结果可视化
  • 对比显示:原始图像与分割结果并排展示。
  • 后处理优化(可选):形态学操作去除噪点。
%% 显示结果
figure;
subplot(1,2,1); imshow(pic); title('原始图像');
subplot(1,2,2); imshow(seg_img); title('SVM分割结果');

%% 形态学去噪(可选)
se = strel('disk',2); % 定义结构元素
seg_img_clean = imopen(seg_img, se); % 开运算去噪
figure; imshow(seg_img_clean); title('形态学优化后结果');

三、完整MATLAB代码

%% 基于SVM的图像分割实例
clear; clc; close all;

%% 1. 读取图像
pic = imread('littleduck.jpg'); % 替换为实际图像路径
[m, n, k] = size(pic);

%% 2. 准备训练样本(示例数据)
TrainData_background = [52 74 87; 76 117 150; 19 48 62; 35 64 82; 46 58 36; 50 57 23; 110 127 135; 156 173 189; 246 242 232; 166 174 151]';
TrainData_foreground = [211 192 107; 202 193 164; 32 25 0; 213 201 151; 115 75 16; 101 70 0; 169 131 22; 150 133 87]';
TrainLabel = [zeros(size(TrainData_background,2),1); ones(size(TrainData_foreground,2),1)];
TrainData = [TrainData_background, TrainData_foreground];

%% 3. 训练SVM模型
model = svmtrain(TrainLabel, TrainData, '-t 1 -d 1 -c 1'); % 线性核,C=1

%% 4. 预测与分割
TestData = double(reshape(pic, m*n, k));
[predict_label, ~, ~] = svmpredict(zeros(size(TestData,1),1), TestData, model);
seg_mask = reshape(predict_label, m, n);
seg_img = pic;
seg_img(~seg_mask) = 0;

%% 5. 显示结果
figure;
subplot(1,2,1); imshow(pic); title('原始图像');
subplot(1,2,2); imshow(seg_img); title('SVM分割结果');

%% 6. 形态学优化(可选)
se = strel('disk',2);
seg_img_clean = imopen(seg_img, se);
figure; imshow(seg_img_clean); title('去噪后结果');

四、关键参数说明

参数 说明 推荐值
-t 核函数类型(1:线性核,2:多项式核,3:RBF核) 线性场景选1
-c 惩罚系数,控制分类误差容忍度 1~100
-d 多项式核阶数(仅-t=1时有效) 1(线性)

参考代码 图像分割、支持向量机(SVM)的一个简单应用实例及matlab代码 www.youwenfan.com/contentalh/97497.html

五、性能优化

  1. 特征增强: 使用HSV颜色空间替代RGB,提升光照不变性。 添加纹理特征(如GLCM)或几何特征(面积、周长)。
  2. 参数调优: 通过网格搜索(Grid Search)优化Cgamma(RBF核)。 使用交叉验证评估模型泛化能力。
  3. 后处理: 结合形态学操作(腐蚀、膨胀)消除噪点。 使用连通域分析去除小面积干扰。

六、应用扩展

  • 多类分割:扩展为多类别问题(如区分天空、草地、建筑物)。
  • 实时分割:结合GPU加速(gpuArray)处理视频流。
  • 深度学习融合:使用预训练CNN提取特征,结合SVM分类。

七、参考

  1. CSDN博客《以图像分割为例浅谈支持向量机(SVM)》
  2. MATLAB官方网页:svmtrainsvmpredict函数说明
  3. 豆丁网论文《基于支持向量机的叶片图像分割》
相关文章
|
8月前
|
计算机视觉
MATLAB实现图像分割:Otsu阈值法
Otsu方法(大津法)是一种广泛使用的自动图像阈值分割技术,它通过最大化类间方差来确定最佳阈值。
|
5月前
|
机器学习/深度学习 算法 安全
【信号处理】(超全45种特征提取)时域、频域、小波、信息熵等45种时频域特征提取方法matlab代码
🔥  内容介绍 时频域特征提取是信号处理领域中的关键技术,其目的是从非平稳信号中提取具有判别性的特征,以便用于后续的分析、识别和分类。随着科学技术的发展,各种时频域分析方法层出不穷,为解决复杂的信号处理问题提供了强有力的工具。本文旨在对45种常见的时频域特征提取方法进行综述,涵盖时域、频域、小波变换和信息熵等多个方面,并概述其在MATLAB中的实现思路,为相关研究提供参考。 一、时域特征 时域分析直接作用于信号的时间序列,简单直观,计算效率高,适用于提取信号的统计特性。以下列举了部分常用的时域特征: 均值 (Mean Value):  信号的平均水平,反映信号的整体直流分量。 方差 (Var
|
2月前
|
存储 人工智能 API
OpenClaw一人AI企业搭建全攻略:阿里云/本地部署,集成Chief+Sub-Agent架构及多Agent操作指南
2026年,用OpenClaw搭建“一人公司”时,很多人会陷入多Agent管理的困境:记忆混乱导致战略分散、Token消耗激增、上下文污染让Agent“越界干活”——明明需要执行者,却养了一群“记忆错乱的演员”。核心问题不在于Agent数量,而在于架构设计错误。
465 0
|
6月前
|
SQL 关系型数据库 MySQL
【SQL优化】不再抓瞎!手把手教你读懂MySQL Explain执行计划
本文详解MySQL执行计划工具EXPLAIN,教你读懂其输出的“天书”表格。重点掌握四个核心指标:`type`(访问类型)、`key`(实际使用索引)、`Extra`(额外信息)和`rows`(扫描行数)。通过实战案例解析慢查询成因与优化方案,助你快速定位SQL性能瓶颈,写出高效数据库查询。
|
前端开发 API Android开发
|
机器学习/深度学习 算法
【机器学习】支持向量机SVM综述
【1月更文挑战第27天】【机器学习】支持向量机SVM综述
|
消息中间件 Java Kafka
Spring Boot与Apache Kafka Streams的集成
Spring Boot与Apache Kafka Streams的集成
|
Linux 开发工具 git
Blktrace原理简介及使用
Blktrace简介 Blktrace是一个用户态的工具,用来收集磁盘IO信息中当IO进行到块设备层(block层,所以叫blk trace)时的详细信息(如IO请求提交,入队,合并,完成等等一些列的信息)。
2171 0
|
机器学习/深度学习 人工智能 并行计算
【图像分类】基于LabVIEW实现四大经典轻量级网络之一MobileNet的图像分类
【图像分类】基于LabVIEW实现四大经典轻量级网络之一MobileNet的图像分类
733 0
【图像分类】基于LabVIEW实现四大经典轻量级网络之一MobileNet的图像分类
|
机器学习/深度学习 算法 计算机视觉
【计算机视觉】图像分割中FCN、DeepLab、SegNet、U-Net、Mask R-CNN等算法的讲解(图文解释 超详细)
【计算机视觉】图像分割中FCN、DeepLab、SegNet、U-Net、Mask R-CNN等算法的讲解(图文解释 超详细)
2127 0

热门文章

最新文章