[python数据分析]基于水色的图像的水质分析

实验要求:《基于水色的图像的水质分析》,采用本文数据,改造不同的分类模型,对该数据进行实验分析。

图像导入与预处理阶段

# -*- coding: utf-8 -*-

# 代码9-1

import numpy as np
import os, re
from PIL import Image

# 图像切割及特征提取
path = '../data/images/'  # 图片所在路径


# 自定义获取图片名称函数
def getImgNames(path=path):
    '''
    获取指定路径中所有图片的名称
    :param path: 指定的路径
    :return: 名称列表
    '''
    filenames = os.listdir(path)
    imgNames = []
    for i in filenames:
        if re.findall('^\d_\d+\.jpg$', i) != []:
            imgNames.append(i)
    return imgNames


# 自定义获取三阶颜色矩函数
def Var(data=None):
    '''
    获取给定像素值矩阵的三阶颜色矩
    :param data: 给定的像素值矩阵
    :return: 对应的三阶颜色矩
    '''
    x = np.mean((data - data.mean()) ** 3)
    return np.sign(x) * abs(x) ** (1 / 3)


# 批量处理图片数据
imgNames = getImgNames(path=path)  # 获取所有图片名称
n = len(imgNames)  # 图片张数
data = np.zeros([n, 9])  # 用来装样本自变量
labels = np.zeros([n])  # 用来放样本标签

for i in range(n):
    img = Image.open(path + imgNames[i])  # 读取图片
    M, N = img.size  # 图片像素的尺寸
    img = img.crop((M / 2 - 50, N / 2 - 50, M / 2 + 50, N / 2 + 50))  # 图片切割
    r, g, b = img.split()  # 将图片分割成三通道
    rd = np.asarray(r) / 255  # 转化成数组数据
    gd = np.asarray(g) / 255
    bd = np.asarray(b) / 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)

    labels[i] = imgNames[i][0]  # 样本标签

基于机器学习的数据分析阶段
首先需要划分测试集与训练集

# 代码9-2	
	
from sklearn.model_selection import train_test_split
# 数据拆分,训练集、测试集
data_tr,data_te,label_tr,label_te = train_test_split(data,labels,test_size=0.2,
                                                     random_state=10)

然后是选择不同的模型进行测试
决策树分类器:

from sklearn.tree import DecisionTreeClassifier
# 模型训练
model = DecisionTreeClassifier(random_state=5).fit(data_tr, label_tr) 
from sklearn.metrics import confusion_matrix

pre_te = model.predict(data_te)
# 混淆矩阵
cm_te = confusion_matrix(label_te, pre_te)

支持向量机

from sklearn import svm

# 模型训练
model = svm.SVC().fit(data_tr, label_tr)
from sklearn.metrics import confusion_matrix

pre_te = model.predict(data_te)
# 混淆矩阵
cm_te = confusion_matrix(label_te, pre_te)

高斯朴素贝叶斯


from sklearn.naive_bayes import GaussianNB

# 模型训练
model = GaussianNB().fit(data_tr, label_tr)
from sklearn.metrics import confusion_matrix

pre_te = model.predict(data_te)
# 混淆矩阵
cm_te = confusion_matrix(label_te, pre_te)

最后对模型分类准确率进行评价

from sklearn.metrics import accuracy_score

# 准确率
print(accuracy_score(label_te, pre_te))

waterquality_dtc.py 为使用决策树的baseline方法
waterquality_svm.py 为使用SVM的baseline方法
waterquality_GaussianNB.py 为使用高斯朴素贝叶斯分类器的baseline方法

模型准确率(大概)
决策树70%
SVM68%
高斯朴素贝叶斯87%

实验数据:
https://download.csdn.net/download/Franklins_Fan/19337360

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值