水质检测系统(Python图像识别)

目标:

有五种水质的图片,水质等级分1~5级,根据这些图片,构建一个分类系统,对新数据进行分类。

注:数据集中每个图片的命名方式都为‘水质级别_序号’

思路:

图片同一个位置上有R,G,B三个像素值,将样本图片裁切为100*100统一大小的图片,每个像素点的每个颜色通道都作为特征,使用颜色矩来表示特征。

特征提取:

1. 将每个像素点的每个颜色通道都作为特征,100 * 100 * 3
2. 使用颜色矩
    颜色矩是一种简单粗暴的颜色特征表示方法
        一阶颜色矩:(均值,表示图片的明亮程度)
        二阶颜色矩:(标准差,表示颜色的分布)
        三阶颜色矩:(标准差再开根) 

 

数据集:

未处理:

经过处理后:

 

 处理方式:

使用Image.crop()方法对图片进行切割,用法如下:

Image.crop(left, up, right, below)
  1. left:与左边界的距离
  2. up:与上边界的距离
  3. right:还是与左边界的距离
  4. 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))

项目链接(阿里云盘分享)

全部评论

相关推荐

dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务