水质检测系统(Python图像识别)
目标:
有五种水质的图片,水质等级分1~5级,根据这些图片,构建一个分类系统,对新数据进行分类。
注:数据集中每个图片的命名方式都为‘水质级别_序号’
思路:
图片同一个位置上有R,G,B三个像素值,将样本图片裁切为100*100统一大小的图片,每个像素点的每个颜色通道都作为特征,使用颜色矩来表示特征。
特征提取:
1. 将每个像素点的每个颜色通道都作为特征,100 * 100 * 3
2. 使用颜色矩
颜色矩是一种简单粗暴的颜色特征表示方法
一阶颜色矩:(均值,表示图片的明亮程度)
二阶颜色矩:(标准差,表示颜色的分布)
三阶颜色矩:(标准差再开根)
数据集:
未处理:
经过处理后:
处理方式:
使用Image.crop()方法对图片进行切割,用法如下:
Image.crop(left, up, right, below)
- left:与左边界的距离
- up:与上边界的距离
- right:还是与左边界的距离
- below:还是与上边界的距离
代码:
'''
@Author : "HCL"
'''
from PIL import Image
import os
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
"""切分图像"""
# dir_list = r'F:\PythonProject\water_test\images'
# cut_img_path = r'F:\PythonProject\water_test\cut_img'
# # 遍历图像文件
# for file in os.listdir(dir_list):
# # print(file)
# # 拼接文件路径
# img_path = os.path.join(dir_list, file)
# # 创建Image对象
# img = Image.open(img_path)
# # 获取图片大小
# x, y = img.size
# # 切分图片
# cut_img = img.crop((x / 2, y / 2, x / 2 + 100, y / 2 + 100))
# # 保存切分后的图片
# cut_img.save(os.path.join(cut_img_path, file))
"""水质检测"""
# 获取处理好的图片数据集
cut_path = r'F:\PythonProject\water_test\cut_img'
datas = []
Y = []
X = []
# 遍历图像
for file in os.listdir(cut_path):
# 创建image对象
img = Image.open(os.path.join(cut_path, file))
# 获取r,g,b
r_img, g_img, b_img = img.split()
r_datas = np.array(r_img)
g_datas = np.array(g_img)
b_datas = np.array(b_img)
# 计算一阶颜色矩
r1 = r_datas.mean()
g1 = g_datas.mean()
b1 = b_datas.mean()
# 计算二阶颜色矩
r2 = r_datas.std()
g2 = g_datas.std()
b2 = b_datas.std()
# 计算三阶颜色矩
r3 = (((r_datas - r1) ** 3).mean()) ** 1 / 3
g3 = (((g_datas - g1) ** 3).mean()) ** 1 / 3
b3 = (((b_datas - b1) ** 3).mean()) ** 1 / 3
X.append([r1, g1, b1, r2, g2, b2, r3, g3, b3])
# 数据集中每个图片的命名方式都为‘水质级别_序号’
Y.append(file.split('_')[0])
X = np.array(X)
# 特征矩阵大小
# print(X.shape)
# 切分数据集
train_X, test_X, train_Y, test_Y = train_test_split(X, Y)
# KNN算法
s = KNeighborsClassifier()
# 训练
s.fit(train_X, train_Y)
# 输出评分
print(s.score(test_X, test_Y))