水质色度表(【数据挖掘实战】——基于水色图像的水质评价(LM神经网络和决策树))
项目地址:Datamining_project: 数据挖掘实战项目代码
目录
一 、背景和挖掘目标
1 、问题背景
2 、水色分类
3 、原始数据
4 、挖掘目标
二 、分析方法和过程
1 、初步分析
2 、总体流程
第1步:数据预处理——图像切割
第2步:特征提取
第3步:构建模型
第4步:水质评价
第5步:决策树模型对比实验
三 、总结和思考
一 、背景和挖掘目标
1 、问题背景
2 、水色分类
水色
浅绿色(清水或浊水)
灰蓝色
黄褐色
茶褐色
(姜黄、茶褐 、红褐 、褐中带绿等)
绿色
(黄绿、油绿 、蓝绿 、墨绿 、绿中带褐等)
水质类别
1
2
3
4
5
3 、原始数据
水产专家按水色判断水质分类,每个水质图片命名规则为“类别-编号.jpg ”
4 、挖掘目标
请根据水质图片 ,利用图像处理技术 ,通过水色图像实现水质的自动评价 。
二 、分析方法和过程
1 、初步分析
通过对拍摄的水样 ,采集得到水样图像 ,而图像数据的维度过大 ,不容易分析 ,需要从中提取水样图像的特征 ,提取反映图像本质的一些关键指标 ,以达到自动进行图像识别或分类的目的 。显然 ,图像特征提取是图像识别或分类的关键步骤 ,图像特征提取的效果如何直接影响到图像识别和分类的好坏 。 图像特征主要包括有颜色特征 、纹理特征 、形状特征 、空间关系特征等 。与几何特征相比 ,颜色特征更为稳健 ,对于物体的大小和方向均不敏感,表现出较强的鲁棒性 。本案例中由于水色图像是均匀的 ,故主要关注颜色特征 。2、总体流程
第1步:数据预处理——图像切割
采集到的水样图像包含盛水容器,容器的颜色与水体颜色差异较大 ,同时水体位于图像中央 ,为了提取水色的特征 ,需要提取水样图像中央部分具有代表意义的图像 ,具体实施方式是提取水样图像中央101*101像素的图像 。
设原始图像 的大小是 ,则截取宽从第个像素点到第 个像素点 。
长从第个像素点到第个像素点的子图像 。 函数表示向0靠拢取整 。
各阶颜色矩的计算公式:
其中Ei是在第i个颜色通道的一阶颜色矩 ,对于RGB颜色空间的图像i=1,2,3 ,Pij是第j个像素的第i个颜色通道的颜色值 。
其中Si是在第i个颜色通道的二阶颜色矩 ,Ei是在第i个颜色通道的一阶颜色矩 。
其中Si是在第i个颜色通道的二阶颜色矩 ,Ei是在第i个颜色通道的一阶颜色矩 。
import numpy as np import pandas as pd from sklearn import preprocessing from PIL import Image import os def PicManage(path,i): pic = Image.open(path) pic.c_x, pic.c_y = (int(i/2) for i in pic.size) box = (pic.c_x-50, pic.c_y-50, pic.c_x+50, pic.c_y+50) #从图片中提取中心100*100的子矩形 region = pic.crop(box) #切分RGB r, g, b = np.split(np.array(region), 3, axis = 2) #计算一阶矩 r_m1 = np.mean(r) g_m1 = np.mean(g) b_m1 = np.mean(b) #二阶矩 r_m2 = np.std(r) g_m2 = np.std(g) b_m2 = np.std(b) #三阶矩 r_m3 = np.mean(abs(r - r.mean())**3)**(1/3) g_m3 = np.mean(abs(g - g.mean())**3)**(1/3) b_m3 = np.mean(abs(b - b.mean())**3)**(1/3) #将数据标准化,区间在[-1,1] typ = np.array([i]) arr = np.array([r_m1,g_m1,b_m1,r_m2,g_m2,b_m2,r_m3,g_m3,b_m3]) #df = pd.DataFrame(preprocessing.minmax_scale(arr,feature_range=(-1,1))).T df = pd.DataFrame(arr).T dn = pd.DataFrame(typ).T return df,dn result = [] type_result = [] for i in os.listdir(images): if i.endswith(.jpg): df,dn = PicManage(images/+i,int(i[0])) result.append(df) type_result.append(dn) data = pd.concat(result) typ = pd.concat(type_result) data = pd.DataFrame(preprocessing.normalize(data,norm=l2)) data[type] = typ.values data.to_excel(picData.xls,index = False)第2步:特征提取
颜色矩特征提取后的数据集:
第3步:构建模型
抽取80%作为训练样本 ,剩下的20%作为测试样本 ,用于水质评价检验。本案例采用支持向量机作为水质评价分类模型 。
#-*- coding:utf-8 -*- import pandas as pd #datapath = ./data/moment.csv #data = pd.read_csv(datapath,encoding = gbk) data = data.values #划分训练集和测试集 #cross_validation在sklearn0.20中改为model_selection from sklearn.model_selection import train_test_split train, test, train_target, test_target = train_test_split(data[:,0:],data[:,-1],test_size=0.2) train_target = train_target.astype(int) test_target = test_target.astype(int) #构建SVM模型 from sklearn import svm model = svm.SVC() model.fit(train*30,train_target) #save model from sklearn.externals import joblib joblib.dump(model,svcmodel.pkl) #read model model = joblib.load(svcmodel.pkl) #混淆矩阵 from sklearn import metrics cm_train = metrics.confusion_matrix(train_target, model.predict(train*30)) cm_test = metrics.confusion_matrix(test_target, model.predict(test*30)) train_accuracy = metrics.accuracy_score(train_target,model.predict(train*30)) test_accuracy = metrics.accuracy_score(test_target,model.predict(test*30)) print("train accuracy: %f"% train_accuracy) #1.000 print("test accuracy: %f"% test_accuracy) #0.9756 tr = pd.DataFrame(cm_train,index = range(1,6),columns = range(1,6)).to_excel(train.xls) te = pd.DataFrame(cm_test,index = range(1,6),columns = range(1,6)).to_excel(test.xls)由混淆矩阵,分类准确率为96.91% ,分类效果较好 ,可应用模型进行水质评价 。
预测值
实际值
1
2
3
4
5
1
41
1
1
0
0
2
0
34
0
0
0
3
0
0
59
0
0
4
0
0
1
20
0
5
0
1
0
1
第4步:水质评价
取所有测试样本为输入样本 ,代入已构建好的LM神经网络模型 ,得到输出结果。
由混淆矩阵 ,分类准确率为95.12% ,说明水质评价模型对于新增的水色图像的分类效果较好 ,可将模型应用到水质自动评价系统 ,实现水质评价 。(注意 ,由于用随机函数来打乱数据 ,因此重复试验所得到的结果可能有所不同 。)
预测值
实际值
1
2
3
4
5
1
7
0
1
0
0
2
0
10
0
0
0
3
0
0
19
0
0
4
0
0
0
3
0
5
0
0
0
1
0
第5步:决策树模型对比实验
import numpy as np import os, re from PIL import Image def get_ImgNames(path): """ 获取图片名称 :param path: 路径 :return: 名称列表 """ # os.listdir用于返回该路径下所包含的文件或文件夹的名字列表 filenames = os.listdir(path=path) imgnames = [] for i in filenames: # 在返回的文件名字中寻找正则表达式所匹配的所有字符串 ,如果不存在 ,返回空列表 if re.findall(^\d_\d+\.jpg$, i) != []: imgnames.append(i) return imgnames def Var(data=None): """ 获取三阶颜色矩 :param p: 数据 :return: 返回三阶颜色矩 """ x = np.mean((data - data.mean()) ** 3) return np.sign(x) * np.abs(x) ** 1 / 3 def imageCutting_FeatureExtraction(path, imgnames=None): """ 图像切割与基于颜色矩进行特征提取 :param path: 路径 :param imgnames: 所有图片的名称 :return: 返回特征提取后的9个分量,以及对应标签 """ # 获取图片的数目 n = len(imgnames) data = np.zeros((n, 9)) # 用来存放特征提取后的分量 label = np.zeros((n)) # 用来存放样本标签 # 对每一张图片进行图像分割 ,并计算9个分量 for i in range(n): # 打开图像文件 img = Image.open(path + imgnames[i]) # 获取图片的尺寸 M, N = img.size # 图像切割提取图样中间部分,img.crop返回图像的矩阵区域 ,参数为 (left, upper, right, lower)的元祖 img = img.crop((M / 2 - 50, N / 2 - 50, M / 2 + 50, N / 2 + 50)) # 将图像分割成3个通道, r, g, b = img.split() # 转化为数组数据并归一化 ,获得对应的像素矩阵 rd = np.array(r, dtype=np.float32) / 255 gd = np.array(g, dtype=np.float32) / 255 bd = np.array(b, dtype=np.float32) / 255 # 计算一阶颜色矩 data[i, 0] = rd.mean() data[i, 1] = gd.mean() data[i, 2] = bd.mean() # 计算二阶颜色矩 data[i, 3] = rd.std() data[i, 4] = gd.std() data[i, 5] = bd.std() # 计算三阶颜色矩 data[i, 6] = Var(rd) data[i, 7] = Var(gd) data[i, 8] = Var(bd) # 获取样本标签-每个图片名的第一个数字代表类别 label[i] = imgnames[i][0] return data, label if __name__ == __main__: # 获取所有图片的名称 imgNames = get_ImgNames(path=images) # 图像切割与特征提取 data, label = imageCutting_FeatureExtraction(path=images/, imgnames=imgNames) print(data) print(label) from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import confusion_matrix, accuracy_score # 划分数据集 # shuffle=True尽可能每一类别都取到或者采用分层抽样 data_tr, data_te, label_tr, label_te = train_test_split(data, label, test_size=0.2, shuffle=True) model = DecisionTreeClassifier(random_state=1234) model.fit(data_tr, label_tr) # 预测 pred_te = model.predict(data_te) # 混淆矩阵 cm = confusion_matrix(label_te, pred_te) print(混淆矩阵为\n, cm) # 准确率 acc = accuracy_score(label_te, pred_te) print(准确率为\n, acc)混淆矩阵和准确率:
三 、总结和思考
我国环境质量评价工作是年代后才逐步发展起来的 。发展至今 ,在评价指标体系及评价理论探索等方面均有较大进展 。但目前我国环境评价实际工作中 ,所采用的方法通常是一些比较传统的评价方法 ,往往是从单个污染因子的角度对其进行简单评价 。然而对某区域的环境质量如水质 、大气质量等的综合评价一般涉及较多的评价因素 ,且各因素与区域环境整体质量关系复杂 ,因而采用单项污染指数评价法无法客观准确地反映各污染因子之间相互作用对环境质量的影响 。 基于上述原因 ,要客观评价一个区域的环境质量状况 ,需要综合考虑各种因素之间以及影响因素与环境质量之间错综复杂的关系 ,采用传统的方法存在着一定的局限性和不合理性 。因此 ,从学术研究的角度对环境评价的技术方法及其理论进行探讨 ,寻求能更全面 、客观 、准确反映环境质量的新的理论方法具有重要的现实意义 。参考:《python数据分析和数据挖掘》
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!