2021-04-11

系列文章目录


前言

本文是对水色图像进行识别


提示:以下是本篇文章正文内容,下面案例可供参考

二、步骤

1.读取一张图片

from PIL import Image
path='D:/shujuwajue/基于水色图像的水质识别/water_images/' 
#图片路径
image=Image.open(path+'1_1.jpg')

2.数据清洗:图片分割

观察图片,发现水出现集中在图片中间,故切割图片中间观察

M,N=image.size
image_mid=image.crop(box=(M/2-50,N/2-50,M/2+50,N/2+50))
r,g,b=image_mid.split()#图片分割

3.特征提取

3.1将图像数据转成数组数据

import numpy as np
rd=np.array(r)/225# 数据归一化
gd=np.array(g)/255
bd=np.array(b)/255

3.2提取水质图像的特征

观察图片得出颜色的特征体现较为明显,故提取颜色矩作为颜色特征

r1=rd.mean()#一阶颜色矩
g1=gd.mean()
b1=bd.mean()
r2=rd.std()#二阶颜色矩
g2=gd.std()
b2=bd.std()
#自定义三阶颜色矩函数
def Var(data=None):
    x1=data-data.mean()
    x2=x1**3
    x3=np.mean(x2)
    x4=np.sign(x3)*abs(x3)**(1/3)
    return x4
#三阶颜色矩
r3=Var(rd)
g3=Var(gd)
b3=Var(bd)

4.批量读取所有图片

4.1自定义函数读取图片

import os
import re
def get_img_name(path=None):
    '''获取指定路径中的所图片
    param path:指定路径
    return:图片名称列表
    '''
    filenames=os.listdir(path)#获取路径下图片的名称
    imName=[]
    for i in filenames:
        if re.findall('^\d_\d+.jpg$',i)!=[]: #获取是图片的文件 
            imName.append(i)
    return imName

4.2批量处理图片

imnames=get_img_name(path)#图片名字
n=len(imnames)#图片张数
data=np.zeros([n,9])#用来存放样本特征,进行模型训练
labels=np.zeros(n)#用来存放样本标签(专家样本),进行模型评估
for i in range(n):
    img=Image.open(path+imnames[i])
    M,N=img.size#获取图片大小
    img=img.crop((M/2-50,N/2-50,M/2+50,N/2+50))#图像裁剪
    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]=imnames[i][0]

5.划分数据集

from sklearn.model_selection import train_test_split
data_train,data_test,labels_train,labels_test=train_test_split(data,labels,test_size=0.2)

6.模型构建和预测

from sklearn.neural_network import MLPClassifier#从sklearn中导入神经网络模型
from sklearn.model_selection import GridSearchCV  #导入网格搜索,搜索最优参数
from sklearn.metrics import r2_score#导入r2评分模型
import warnings
warnings.filterwarnings("ignore")#忽略警告
#模型超参数选择
params={
        'hidden_layer_sizes':[*range(1,10)],#hidden_layer_sizes=隐藏层大小
        'max_iter':[10,100,1000],#最大跌代次数
        'solver':('adam','lbfgs','sgd'),#优化方法
        'activation':('identity','logistic','tanh','relu')#激活函数,映射函数
    }
mlp=MLPClassifier()
GS = GridSearchCV(mlp,params,cv=5,scoring='r2')#cv:(交叉验证)次数为5,评价指标为r2_score
GS.fit(data_train,labels_train)
print(GS.best_params_)  #最佳参数
print(GS.best_score_)  #最优评分(对应最佳参数)
model=MLPClassifier(activation='relu', hidden_layer_sizes=7, max_iter=100, solver='lbfgs')#模型构建
model.fit(data_train,labels_train)#模型训练

7.模型预测评估

pre=model.predict(data_test)
pre
print('自带模型评分',model.score(data_test,labels_test))#模型评分
print('r2评分',r2_score(labels_test,pre))
from sklearn.metrics import mean_absolute_error,mean_squared_error#导入平均误差和均方误差
from sklearn.metrics import confusion_matrix,classification_report#导入混淆矩阵和分类报告
print('平均绝对误差',mean_absolute_error(labels_test,pre))
print('均方误差为',mean_squared_error(labels_test,pre))
print('混淆矩阵为\n',confusion_matrix(labels_test,pre))
print('分类报告为\n',classification_report(labels_test,pre))

总结

此文仅是作者个人的做法,若有异议,欢迎评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值