基于SVM的图像分割-真彩色图像分割

图像分割是计算机视觉中的关键任务之一,而支持向量机(Support Vector Machine,SVM)则是一种强大的机器学习算法。使用支持向量机(SVM)实现自然图像自动分类的方法,利用区域分割方法将图像区分为前景和背景图像,进而提取前景图像的特征向量作为SVM训练样本,实现语义分类器。图片:链接:https://pan.baidu.com/s/1uWU5H2IXtduoBC6t42vS8g?pwd=aw60 
提取码:aw60

基于SVM的图像分割-真彩色图像分割

%%清空环境变量

tic;
close all;
clear;
clc;
format compact;


%% 读取图像数据

% 读入图像,放在矩阵pic
pic = imread('littleduck.jpg');
% 查看矩阵pic的大小和类型
whos pic;

scrsz = get(0,'ScreenSize');
figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6  scrsz(3)*4/5 scrsz(4)]*3/4);
imshow(pic);


%% 确定训练集

TrainData_background = zeros(20,3,'double');
TrainData_foreground = zeros(20,3,'double');

采样函数 msgbox

% % 背景(湖水)采样

% % 背景(湖水)采样
% msgbox('Please get 20 background samples(点击OK后再按任意键继续)', ...
%     'Background Samples','help');
% pause;
% for run = 1:20
%     [x,y] = ginput(1);
%     hold on;
%     plot(x,y,'r*');
%     x = uint8(x);
%     y = uint8(y);
%     TrainData_background(run,1) = pic(x,y,1);
%     TrainData_background(run,2) = pic(x,y,2);
%     TrainData_background(run,3) = pic(x,y,3);
% end 

% % 待分割出来的前景(鸭子)采样
% msgbox('Please get 20 foreground samples which is the part to be segmented(点击OK后再按任意键继续)', ...
%     'Foreground Samples','help');
% pause;
% for run = 1:20
%     [x,y] = ginput(1);
%     hold on;
%     plot(x,y,'ro');
%     x = uint8(x);
%     y = uint8(y);
%     TrainData_foreground(run,1) = pic(x,y,1);
%     TrainData_foreground(run,2) = pic(x,y,2);
%     TrainData_foreground(run,3) = pic(x,y,3);
% end 

% % 待分割出来的前景(鸭子)采样 

% % 待分割出来的前景(鸭子)采样
% msgbox('Please get 20 foreground samples which is the part to be segmented(点击OK后再按任意键继续)', ...
%     'Foreground Samples','help');
% pause;
% for run = 1:20
%     [x,y] = ginput(1);
%     hold on;
%     plot(x,y,'ro');
%     x = uint8(x);
%     y = uint8(y);
%     TrainData_foreground(run,1) = pic(x,y,1);
%     TrainData_foreground(run,2) = pic(x,y,2);
%     TrainData_foreground(run,3) = pic(x,y,3);
% end 

 

% % 背景(湖水)训练样本 10*3

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];

% % 前景(鸭子)训练样本 8*3

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];

%% 建立支持向量机

% 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;

 源自:《Matlab神经网络43个案例分析》。 

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值