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

本文介绍了一种利用MATLAB和SVM支持向量机进行图像分割的方法,特别针对印章图像的提取。通过选取RGB通道值作为训练数据,标注后训练模型,然后应用到整图以获得预测结果。程序使用了v-SVC,线性核函数等参数,并展示了实际运行效果,包括训练点选择、二值化图像和不同场景下的应用。同时,探讨了SVM在图像分割领域的潜力和局限性。
摘要由CSDN通过智能技术生成

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;

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值