泰迪智能科技(数据挖掘平台:TipDM数据挖掘平台)最新推出的数据挖掘实战专栏
专栏将数据挖掘理论与项目案例实践相结合,可以让大家获得真实的数据挖掘学习与实践环境,更快、更好的学习数据挖掘知识与积累职业经验
专栏中每四篇文章为一个完整的数据挖掘案例。案例介绍顺序为:先由数据案例背景提出挖掘目标,再阐述分析方法与过程,最后完成模型构建,在介绍建模过程中同时穿插操作训练,把相关的知识点嵌入相应的操作过程中。
为方便读者轻松地获取一个真实的实验环境,本专栏使用大家熟知的Python语言对样本数据进行处理以进行挖掘建模。
————————————————
数据预处理
附件在“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] # 样本标签 |