遥感影像分类之SVM
目录
一、背景简介
遥感图像分类就是利用计算机通过对遥感图像中各类地物的光谱信息和空间信息进行分析,选择特征,将图像中各个像元按照某种规则或算法划分不同的类别,然后获得遥感图像中与实际地物的对应信息,从而实现图像的分类。遥感图像计算机分类的依据是遥感图像像素的相似度,常使用距离和相关系数来衡量相似度。常见的分类方法有:监督分类、非监督分类法。
在知网中以遥感影像分类为关键词搜索,可以看到遥感影像分类从2000年之后便引起了人们的广泛关注,特别是近10年以来,随着计算机技术的提高,遥感影像分类更是迎来了前所未有的发展。
其中,支持向量机就是属于监督学习的一类分类方法。
支持向量机 (SVM) 是一个类分类器,正式的定义是一个能够将不同类样本在样本空间分隔的超平面。 换句话说,给定一些标记(label)好的训练样本 (监督式学习), SVM算法输出一个最优化的分隔超平面。
二、环境介绍
在本次实验中,使用Python+libsvm实现遥感影像分类。主要环境为:Python3.7.3,Libsvm 3.20;
Python环境为:Pycharm+Anaconda
三、分类步骤
3.1 训练数据预处理
我们这里选择三个特征值作为训练数据,分别为:熵、能量、平均值,本次实验选择2类共计40条数据作为训练数据,处理完的数据格式如下:
其中第一列代表分类标签,这里分为两类,所以使用1和2作为区分;第2列、第三列和第四列分别为训练数据,1、2、3代表特征值个数,冒号后为特征值。注意:其中的训练数据不仅限于三个,数量越多,分类效果越好。
3.2 导入相关扩展包
from PIL import Image
import sys
path = "F:\Machine Learning\ML\libsvm-3.20\python"
sys.path.append(path)
from svmutil import *
import cv2
这里libsvm为官网下载,未安装,所以直接导入使用,也可使用安装好的扩展包
3.2 读取训练数据与训练标签
with open('train_data.txt', 'r') as f:
for line in f:
line = line.strip('\n')
str = line.split(",")
b= []
for str1 in str:
b.append(int(str1))
#print(b)
train_data.append(b)
with open('train_label.txt', 'r') as file:
train_label=[]
for lines in file:
line = lines.strip('\n')
train_label.append(int(line))
将训练数据与训练标签分别放入train_data与train_label
3.3 确定参数g和c
其中g为核函数的参数设置,c为惩罚系数。在libsvm中,提供了grid.py文件来确定g和c
3.4 使用svm训练模型
parameter = '-c 0.03125 -g 0.0001220703125'
model = svm_train(train_label, train_data, parameter)
3.5 使用模型进行分类
yt, xt = svm_read_problem('Testdata_all_test.txt')
p_label, p_acc, p_val = svm_predict(yt[0:], xt[0:], model)
在分类之后,分别将分类后的标签、精度、值分别放入了p_label, p_acc, p_val。
至此,分类已经结束。
四、分类结果显示与保存
4.1 结果显示
for p in range(0,img.shape[0]):
for q in range(0, img.shape[1]):
if int(p_label[n]) == 1:
pixTuple = (230,230,255, int(p_label[n]))
img_new.putpixel((q, p), pixTuple)
if int(p_label[n]) == 2:
pixTuple = (0,0,255, int(p_label[n]))
img_new.putpixel((q, p), pixTuple)
n=n+1
img_new.show()
这里使用p_label标签作为结果进行显示,若标签值为1,则颜色为浅灰色;若标签值为2,则颜色为蓝色。
4.2 结果保存
img_new.save("pic.png")
五、结果展示
下图为分类前后效果对比,可以看出,分类结果较为明显:
分类前:
分类后:
六、误差分析
此次分类结果出现误差主要有两个方面的因素:
一是训练样本的数量不足,影像共有1981*1331个像元,而训练集只选择了其中40个;二是SVM本身的误差。
上一篇: 判断两个链表是否相交,若相交,求交点,考虑带环情况实现代码
下一篇: 使用HTML