Advertisement

基于水色图像的水质评价_基于水色图像的水质评价

阅读量:
395faa7b3d5a1ecc6f2215c18337add1.png
035998cb562872fcf406cf456b91cffa.png

数据探索与预处理

任务1.1 读取一张图片数据并用Python查看图片,截取图像的有效区域

对图片数据进行RGB三色通道分割,并对每个RGB颜色通道的数据进行像素值矩阵转换

任务1.3 了解水质图像特征-颜色矩,自定义计算三阶颜色矩的函数

任务1.4 计算三个颜色通道的一阶颜色矩、二阶颜色矩和三阶颜色矩

任务1.5 自定义函数正确获取指定路径中的所有图片名称

任务1.6 **个人定制的函数通过循环结构处理所有图片的数据,在计算阶段统计所有图像的颜色矩特征,并提取图像标签信息;在提取完成后将结果分别存储为数组。

在读取样本图片时需要注意的是Python内置的函数处理图片较为不便的操作包括但不限于图片读取等步骤这个时候就需要安装第三方库以满足后续的数据处理需求我们可以利用PIL库来处理图片数据其中关键一步是特征提取过程具体而言我们需要根据水质的不同建立相应的分类标准为此我们首先要确定衡量水质特征的方法比如区分生物性别时可以从是否有胡须或者喉结等方面入手那么水质的特征如何量化呢常规图像特征主要包括颜色纹理形状和空间分布等方面在这个案例中我们重点关注纹理特征和形状特征对于水质划分是否存在相关性需要注意的是即使将相同种类的水放置于不同容器中其水质属性是保持一致的因此我们选择使用颜色指标来反映水体的整体清澈程度颜色区域主要集中在图像中间部分

到此为止,任务1.1的内容已经介绍完毕。接下来则是任务2 对图片数据进行RGB三色通道划分,并对每个颜色通道的数据分别转化为对应的像素值矩阵

那么水的颜色特征可以用什么具体的数值来衡量呢?首先必须将所有的图片数据转换为能够反映颜色特征的数值型数据。原始的图片是一张彩色照片因此我们需要将其分割并提取RGB三个颜色通道的信息以反映其颜色特征特性处理完后将其转化为基于RGB通道的数组形式的数据

至此, 完成了对任务1.2内容的介绍, 下一步将深入学习水质图像的颜色特征分析——颜色矩, 并自行开发并实现三阶颜色矩计算函数; 同时, 还需完成任务1.4, 即分别计算红、绿、蓝三个色彩通道的一阶、二阶及三阶统计量

在水质分类过程中, 我们主要依赖的颜色特征是色调分布的概率密度函数P(r,g,b)以及其对应的统计特性参数集M={μ_r^k, μ_g^k, μ_b^k} (k=1~3)等一些基本统计量对吧?同样的在这里我们采用均值(一阶矩)、标准差(二阶矩)以及归一化后的三阶中心矩来描述每个图像通道的空间分布特性。这样做的好处在于能够有效提取图像中各色彩通道的空间信息特征而不至于被过多的颜色细节所困扰从而实现数据的有效降维和简化处理

至此, 任务\textsuperscript{①}及任务\textsuperscript{②}的相关内容已经阐述完毕, 接下来将重点分析的是自定义函数如何正确获取指定路径下的全部图片文件名

接下来的目标是为每张图片执行之前的计算操作。在这一阶段开始之前,请确保已经完成了以下步骤:首先从数据库中取出对应的图像数据并加载到内存中;然后调用预定义好的函数对其进行处理;这时可以使用os模块来遍历文件夹中的每一个子目录,并将其中符合条件的图像文件提取出来;需要注意的是,在我们的图像文件夹中可能存在一些隐藏的非必要的副本文件;因此我们需要找到一种方法能够准确地排除这些干扰项;这个时候就需要应用正则表达式来匹配和判断哪些是真正的有效图像名;通过这种方式就能确保后续处理的数据都是干净可靠的

至此, 任务1.5 的相关内容已介绍完毕, 现在开始进行任务1.6: 自行编写函数, 使用循环结构计算所有图片的颜色直方图, 并将其存储于数组中以获取图片标签

为了提高训练效率,
我们需要设置数据类型为数组或Dataframe结构,
其中每行代表一个样本,
即一张图片。
那么总共有多少列?
在单张图片中我们计算得到了9个特征,
这些特征分别来自三个通道的颜色距离测量。
如果有n张图片的话,
我们就需要构建一个n行9列的矩阵来存储我们的数据。
我们可以先创建一个空的或者全0矩阵,
然后通过for循环遍历每一张图片,
计算其各阶颜色距并提取标签信息,
将这些数值逐一填充到我们的矩阵中。
最后将整个处理流程封装成一个函数,
以便于后续调用与扩展。

模型训练与预测

任务2.1 了解常用的分类算法,选择其中之一作为模型训练

任务2.2 导入数据,将数据划分为训练集和测试集,训练模型和预测

首先掌握常见的分类算法原理及应用领域,在此基础上从决策树这一典型方法入手开展模型训练工作;通过对比分析决策树与其他几种主流分类方法(如k紧邻法)的特点与适用场景范围,在综合考虑各方法优势的基础上选择适合当前问题的最优分类器开展建模工作;然后深入探究影响模型性能的关键因素及其优化策略;最后通过建立完整的特征工程体系实现对原始数据的有效预处理,并在此基础上构建完整的机器学习工作流

在实际操作中首先需要加载待分析的数据集;然后按照合理的方式将其划分为训练集与测试集两部分;随后对提取出的特征向量进行标准化处理以消除各变量之间的量纲差异;接着基于选定的评估指标对模型性能进行全面考察并据此调整优化参数进而提高模型预测效果

任务3:选择合适的方法评估模型

这个任务主要就是选择合适的评价指标来对已经经过良好训练的机器学习模型进行性能评测工作

复制代码
 import os, re

    
  
    
 from PIL import Image
    
 import numpy as np
    
  
    
 path = 'water_images/'
    
  
    
  
    
 def var(rd):    # 求颜色通道的三阶颜色矩
    
     mid = np.mean((rd-rd.mean())**3)
    
     return np.sign(mid)*abs(mid)**(1/3)
    
  
    
 def get_img_names(path=path):
    
     file_names = os.listdir(path)
    
     img_names = []
    
     for i in file_names:
    
     if re.findall('^d_d+.jpg$', i) != []:
    
         img_names.append(i)
    
     return img_names
    
  
    
  
    
 def get_img_data(path=path):
    
     img_names = get_img_names(path=path)
    
     n = len(img_names)
    
     data = np.zeros([n, 9])
    
     labels = np.zeros([n])
    
     for i in range(n):
    
     img = Image.open(path+img_names[i])  # 读取图片数据
    
     M, N = img.size                      # 像素矩阵的行列数
    
     region = img.crop((M/2-50, N/2-50, M/2+50, N/2+50))  # 截取图像的中心区域
    
  
    
     r, g, b = region.split()   # 分割像素通道
    
     rd = np.asarray(r)    # 将图片数据转换为数组
    
     gd = np.asarray(g)
    
     bd = np.asarray(b)
    
  
    
     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)
    
  
    
     labels[i] = img_names[i][0]
    
     return data, labels
复制代码
 from data_process import get_img_data     # 导入数据预处里的函数

    
 from sklearn.tree import DecisionTreeClassifier
    
 from sklearn.model_selection import train_test_split
    
 from sklearn.metrics import classification_report, confusion_matrix
    
  
    
  
    
 data, labels = get_img_data()    # 数据预处理
    
  
    
 data_tr, data_te, labels_tr, labels_te = train_test_split(data, labels, test_size=0.2)  # 将专家样本拆分为训练集和测试集
    
 Dtc = DecisionTreeClassifier().fit(data_tr, labels_tr)  # 模型训练
    
 pre = Dtc.predict(data_te)   # 模型预测
    
  
    
 sum(pre==labels_te)/len(pre)            # 预测精度
    
 confusion_matrix(labels_te, pre)        # 混淆矩阵
    
 classification_report(labels_te, pre)   # 分类性能报告

全部评论 (0)

还没有任何评论哟~