基于水色图像的水质评价

1.背景与挖掘目标
通过观察水色变化调控水质,维持水体生态系统平衡。
2.分析方法与过程
通过图像显示提取水样特征,提取反映图像本质的关键指标,以达到自动进行图像识别或分类的目的。图像特征包括颜色特征,纹理特诊,形状特征和空间关系特征等。此处采用颜色特征进行处理,基于颜色矩的特征提取。
步骤:
1.采集水样图像进行选择性抽取和实时抽取,形成建模数据和增量数据(即为训练集与测试集)
2.对上述数据集进行预处理,包括图像切割和颜色矩特征提取
3.对已完成数据进行预处理,有专家经验进行分类,构成专家样本
4.专家样本构建分类模型
5.利用模型进行水质评价

3.数据预处理
由于图像较大,我们提取每张图片最中间的100x100像素构成子图象集。这里写图片描述
我们采用颜色矩来提取水样特征。这种方法的数学基础在于图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布。与颜色直方图相比,该方法的另一个好处在于无需对特征进行向量化。因此,图像的颜色矩一共只需要9个分量(3个颜色分量,每个分量上3个低阶矩),与其他的颜色特征相比是非常简洁的。在实际应用中为避免低次矩较弱的分辨能力,颜色矩常和其它特征结合使用,而且一般在使用其它特征前起到过滤缩小范围(narrow down)的作用。

这里写图片描述
其中Ei是第i个颜色通道的一阶颜色矩,对于RGB颜色空间的图像,i=1,2,3,pij是第i个像素点的第j个颜色通道的颜色值。
在颜色矩的提取中,提取每个文件名中的类别和序号,同时针对所有图片进行同样操作。

#-*- coding: utf-8 -*-
#导入库文件
from skimage import io,data
import matplotlib.pyplot as plt
import matplotlib.image as mpimg 
import numpy as np
import os
import pandas as pd
%matplotlib inline
img = mpimg.imread('data/images/1_1.jpg')#读取一张图片
l,w,t=img.shape                          #提取长,宽,通道数
print(l,w)
plt.imshow(img)
#寻找中心100x100像素点
l_max =img.shape[0]//2+50
l_min=img.shape[0]//2-50
w_max =img.shape[1]//2+50
w_min =img.shape[1]//2-50
#计算颜色矩特征
def img2vector(filename):
    returnvect=np.zeros((1,9))
    fr=mpimg.imread(filename)
    water=fr[l_min:l_max,w_min:w_max,:].reshape(1,10000,3)
    for i in range(3):
        this = water[:,:,i]/255
        returnvect[0,i]=np.mean(this)
        returnvect[0,3+i]=np.sqrt(np.mean(np.square(this-returnvect[0,i])))
        returnvect[0,6+i]=np.cbrt(np.mean(np.power(this-returnvect[0,i], 3)))
    return returnvect 
trainfilelist=os.listdir('data/images')#读取目录下文件列表
m=len(trainfilelist)                   #计算文件数目
labels=np.zeros((1,m))
train=np.zeros((1,m))
trainingMat=[]
#print(trainfilelist)
trainingMat=np.zeros((m,9))
for i in range(m):
    filenamestr=trainfilelist[i]      #获取当前文件名,例1_1.jpg
    filestr=filenamestr.split('.')[0]  #按照.划分,取前一部分
    classnumstr=int(filestr.split('_')[0])#按照_划分,后一部分为该类图片中的序列
    picture_num = int(filestr.split('_')[1])
    labels[0,i]=classnumstr               #前一部分为该图片的标签
    train[0,i]=picture_num
    trainingMat[i,:]=img2vector('data/images/%s' % filenamestr)
    #构成数组
data=np.concatenate((labels.T,train.T,trainingMat),axis=1)#连接数组
dataframe=pd.DataFrame(data,columns['label','num','R_1','G_1','B_2',
'R_2','G_2','B_2','R_3','G_3','B_3'])
dataframe.to_csv('tmp/moment.csv',header=None,index=None)#保存文件

这里写图片描述

模型构建
抽取80%作为训练样本,20%作为测试样本,用于水质评价。

#-*- coding: utf-8 -*-
import pandas as pd

inputfile = 'tmp/moment.csv' #数据文件
#outputfile1 = '../data/cm_train.xls' #训练样本混淆矩阵保存路径
#outputfile2 = '../data/cm_test.xls' #测试样本混淆矩阵保存路径
data = pd.read_csv(inputfile, encoding = 'gbk') #读取数据,指定编码为gbk
data = data.as_matrix()

from numpy.random import shuffle #引入随机函数
shuffle(data) #随机打乱数据

data_train = data[:int(0.8*len(data)), :] #选取前80%为训练数据
data_test = data[int(0.8*len(data)):, :] #选取前20%为测试数据
#构造特征和标签
x_train = data_train[:, 2:]*30
y_train = data_train[:, 0].astype(int)
x_test = data_test[:, 2:]*30
y_test = data_test[:, 0].astype(int)

#导入模型相关的函数,建立并且训练模型
from sklearn import svm
model = svm.SVC()
model.fit(x_train, y_train)

#导入输出相关的库,生成混淆矩阵
from sklearn import metrics
cm_train = metrics.confusion_matrix(y_train, model.predict(x_train))
cm_test = metrics.confusion_matrix(y_test, model.predict(x_test))
pd.DataFrame(cm_train, index=range(1,6),columns=range(1,6)).to_excel('cm_train.xls')
pd.DataFrame(cm_test, index=range(1,6),columns=range(1,6)).to_excel('metrics_test.xls')

上述随机打乱踩到了一个坑,就是shuffle函数。
网上百度随机打乱的话一般会得到

from random import shuffle
shuffle(data

像上面这个打乱属于自带库,如果应用于程序,经过多次大乱后会偏向大概率出现的数据,导致这些数据重复出现,原数据中出现次数少的会被抹除。做了一晚上踩在这个坑上也是欲哭无泪。
所以一般对数组打乱顺序操作最好选择numpy.random.shuffle().

还有一种打乱方式是不直接套用库,需要自己写程序。基本思路是,打乱索引,根据大乱的索引来重组数组,其余部分不变。

import numpy as np
m=len(data)
mum=np.zeros((m,11))
index = [i for i in range(m)]
random.shuffle(index)
print(index)
print(len(index))
#print(data[:,0])
for i in range(m):
    mum[i,:]=data[index[i]]
data_train=mum[:int(0.8*len(data)),:]
data_test=mum[int(0.8*len(data)):,:]

模型混淆矩阵
模型混淆矩阵

水质评价混淆矩阵
水质评价混淆矩阵

由于数据比较少,随机打乱具有较大的偶然性,模型准确率会有较大波动。
此文纯属学习娱乐。

                                                            2018.01.15版
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值