基于libsvm的图像分割
——30cases与40cases&25cases“联谊”第一弹
By faruto
2010/6/2
[code]
%% ImSegmentLibsvm
% a litter test of image segment based on libsvm
% by faruto
% Email:patrick.lee@foxmail.com
% QQ:516667408
% http://blog.sina.com.cn/faruto
% last modified 2010.06.01
% Super Moderator @ www.ilovematlab.cn
%%
tic;
close all;
% clear;
clc;
format compact;
%%
pic = imread('littleduck.jpg');
figure;
imshow(pic);
%% 确定训练集
TrainData_background = zeros(10,3,'double');
TrainData_foreground = zeros(10,3,'double');
% 背景采样
msgbox('Please get 20 background samples','Background Samples','help');
pause;
for run = 1:20
end
% 待分割出来的前景采样
msgbox('Please get 20 foreground samples which is the part to be segmented', 'Foreground Samples','help');
pause;
for run = 1:20
end
% % 背景训练样本 10*3
% TrainData_background = ...
%
%
%
%
%
%
%
%
%
%
% % 前景训练样本 8*3
% TrainData_foreground = ...
%
%
%
%
%
%
%
%
% let background be 0 & foreground 1
TrainLabel = [zeros(length(TrainData_background),1); ...
%% 建立支持向量机 基于libsvm
TrainData = [TrainData_background;TrainData_foreground];
model = svmtrain(TrainLabel, TrainData, '-t 1 -d 1');
%% 进行预测 i.e.进行图像分割 基于libsvm
preTrainLabel = svmpredict(TrainLabel, TrainData, model);
[m,n,k] = size(pic);
TestData = double(reshape(pic,m*n,k));
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;
figure;
imshow(pic_seg);
figure;
subplot(1,2,1);
imshow(pic);
subplot(1,2,2);
imshow(pic_seg);
%%
toc;
[/code]
测试图片结果: