暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据分析案例:基于水色图像的水质评价(二)

泰迪教育 2020-08-06
1128

还未阅读第一篇的小可爱,链接在这里哦👇
数据分析案例:基于水色图像的水质评价(一)


数据预处理



附件在“demo/data/images/”目录下给出了某地区的多个罗非鱼池塘水样的数据,包含水产专家按水色判断水质分类的数据以及用数码相机按照标准进行水色采集的数据(如表1,图 1所示),每个水质图片命名规则为“类别-编号.jpg”,如“1_1.jpg”说明当前图片属于第1类的样本。


表1  水色分类


图1  标准条件下拍摄的水样图像 

*数据代码联系客服领取


1. 图像切割


采集到的水样图像包含盛水容器,容器的颜色与水体颜色差异较大,同时水体位于图像中央,为了提取水色的特征,需要提取水样图像中央部分具有代表意义的图像,具体实施方式是提取水样图像中央101×101像素的图像。设原始图像的大小是M×N,则截取宽从第个像素点到第个像素点,长从第个像素点到第个像素点的子图像。

使用Python编程软件进行编程,即可把2中左边的切割前的水样图像切割并保存到右边的切割后的水样图像。

         

图2  切割前水样图像(左)和切割后水样图像(右)


2. 特征提取

在本案例中选择采用颜色矩来提取水样图像的特征,下面给出各阶颜色矩的计算公式。


(1)一阶颜色矩

一阶颜色矩采用一阶原点矩,反映了图像的整体明暗程度,如式(1-1所示。

  1-1

式(1)中是在第个颜色通道的一阶颜色矩,对于RGB颜色空间的图像,是第个像素的第个颜色通道的颜色值。


(2)二阶颜色矩


二阶颜色矩采用的是二阶中心距的平方根,反映了图像颜色的分布范围,如(1-2)所示。

  (1-2

式(2中是在第个颜色通道的二阶颜色矩,是在第个颜色通道的一阶颜色矩。


(3)三阶颜色矩 

三阶颜色矩采用的是三阶中心距的立方根,反映了图像颜色分布的对称性,如(1-3)所示。

  (1-3)

式(1-3)中是在第个颜色通道的三阶颜色矩,是在第个颜色通道的一阶颜色矩。

对切割后的图像提取其颜色矩,作为图像的颜色特征。颜色矩的提取,并且提取每个文件名中的类别和序号,同时针对所有的图片都进行同样的操作,因提取的特征的取值范围差别较大,如果直接输入模型,可能会导致模型精确度下降,因此,在建模之前需要将数据进行标准化,应如代码清单1所示。

代码清单1  图像切割和特征提取
import numpy as np
import os,re
from PIL import Image
 
# 图像切割及特征提取
path = './demo/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]  # 样本标签
*数据代码联系客服领取

报名参加Python数据分析挖掘就业班/师资培训
请联系:
       蔡老师  电话13533974213(微信同号)
       陈老师  电话13763027597(微信同号) 
                     电话18820564556(微信同号)

关注公众号回复【客服】,添加获取本案例源数据与代码


文章转载自泰迪教育,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论