python数据处理 根据颜色对图片进行分类的方法


Posted in Python onDecember 08, 2018

前面一篇文章有说过,利用scrapy来爬取图片,是为了对图片数据进行分类而收集数据。

本篇文章就是利用上次爬取的图片数据,根据图片的颜色特征来做一个简单的分类处理。

实现步骤如下:

1:图片路径添加

2:对比度处理

3:滤波处理

4:数据提取以及特征向量化

5:图片分类处理

6:根据处理结果将图片分类保存

代码量中等,还可以更少,只是我为了练习类的使用,而将每个步骤都封装成了一个独立的类,当然里面也有类继承的问题,遇到的问题前面一篇文章有讲解。内容可能有点繁琐,尤其是文件和路径的使用(可以自己修改),已经尽量优化代码了。

爬取的原始数据如下:

python数据处理 根据颜色对图片进行分类的方法

直接上代码:

import os
import numpy as np
import skimage
import matplotlib.pyplot as plt
from skimage import io 				#读取图片
from skimage import exposure		#调用调对比度的方法	rescale_intensity、equalize_hist
from skimage.filters import gaussian	#高斯
from skimage import img_as_float  #图片unit8类型到float
from scipy.cluster.vq import kmeans,vq,whiten  #聚类算法
import shutil	#文件夹内容删除
 
class Path(object):
	def __init__(self):
		self.path = r"D:\PYscrapy\get_lixiaoran\picture"
		self.pathlist = []	#原始图片列表
		self.page = 0
 
	def append(self):					#将每张图片的路径加载到列表中
		much = os.listdir(self.path)
		for i in range(len(much)):
			repath = os.path.join(self.path,str(self.page)+'.jpg')
			self.page +=1
			self.pathlist.append(repath)
		return self.pathlist
 
class Contrast(object):
	def __init__(self,pathlist):
		self.pathlist = pathlist
		self.contrastlist = []	#改变对比度之后的图片列表
		self.path2 = r"D:\PYscrapy\get_lixiaoran\picture2"
		self.page2 = 0
 
	def balance(self):			#将每张图片进行对比度的处理,两种方式 1:均衡化 2:从某个值开始取极值
		if os.path.exists(self.path2) == False:
			os.mkdir(self.path2)
 
		# for lis in self.pathlist:
		# 	data = skimage.io.imread(lis)
		# 	equalized = exposure.equalize_hist(data)	#方法一这里使用个人人为更好的均衡化处理对比度的方法
		# 	self.contrastlist.append(equalized)
 
		for lis in self.pathlist:
			data = skimage.io.imread(lis)
			high_contrast = exposure.rescale_intensity(data,in_range=(20,220))	#方法二 以20和220取两端极值
			self.contrastlist.append(high_contrast)
 
		for img in self.contrastlist:
			repath = os.path.join(self.path2,str(self.page2)+'.jpg')		#保存修改后的图片
			skimage.io.imsave(repath,img)
			self.page2 +=1
 
class Filter(Contrast):
	def __init__(self,pathlist):
		super().__init__(pathlist)
		self.path31 = self.path2
		self.path32 = r"D:\PYscrapy\get_lixiaoran\picture3"
		self.page3 = 0
		self.filterlist = []
 
	def filte_r(self):
		img = os.listdir(self.path31)	#读取文件内容
		if os.path.exists(self.path32) == False:
			os.mkdir(self.path32)
		for lis in range(len(img)):			#循环做每张图片的高斯过滤
			path = os.path.join(self.path31,str(lis)+r'.jpg')
			img = skimage.io.imread(path)
			gas = gaussian(img,sigma=3)		#multichannel=False	去掉颜色2D
			self.filterlist.append(gas)
			path_gas = os.path.join(self.path32,str(self.page3)+r'.jpg')
			skimage.io.imsave(path_gas,gas)
			self.page3 +=1
		return self.path32
 
class Vectoring(object):
	def __init__(self,filter_path):
		self.path41 = filter_path
		self.diff = []
		self.calculate = []
 
	def vector(self):
		numbers = os.listdir(self.path41)	#获取文件夹内容
		os.chdir(self.path41)		#切换路径
		for i in range(len(numbers)):
			self.diff.append([])
			for j in range(4):
				self.diff[i].append([])		#diff[[number],[img_float],[bin_centers],[hist]]
 
		for cnt,number in enumerate(numbers):
			img_float = img_as_float(skimage.io.imread(number))		#将图像ndarry nint8->float
			hist,bin_centers = exposure.histogram(img_float,nbins=10)	#取图像的	每个区间的像素值	分隔区间
			self.diff[cnt][0] = number
			self.diff[cnt][1] = img_float
			self.diff[cnt][2] = bin_centers	#把数据添加到diff中
			self.diff[cnt][3] = hist
 
		for i,j in enumerate(self.diff):		#使用hist和bin_centers相乘来降维,向量化
			self.calculate.append([y*self.diff[i][3][x] for x,y in enumerate(self.diff[i][2])])	#这里可能需要理解一下,就是涉及的参数有点多
		for i in range(len(self.diff)):
			self.diff[i].append(self.calculate[i])	#将特征向量calculate也加入到diff中
 
		return self.diff 			#diff[[number],[img_float],[bin_centers],[hist],[calculate]]
 
class Modeling(Vectoring):
	def __init__(self,filter_path,K):
		super().__init__(filter_path)
		self.K = K
 
	def model(self):
		diff = self.vector()
		calculate = []
		for i in range(len(diff)):
			calculate.append(diff[i][4])
		spot = whiten(calculate)			#这里使用scipy的k-means方法来对图片进行分类
		center,_ = kmeans(spot,self.K)		#如果对scipy的k-means不熟悉,前面有专门的讲解
		cluster,_ = vq(spot,center)
		return diff,cluster 	#获得预测值
		
class Predicting(object):
	def __init__(self,predicted_diff,predicted_cluster,K):
		self.diff = predicted_diff
		self.cluster = predicted_cluster
		self.path42 = r'D:\PYscrapy\get_lixiaoran\picture4'
		self.K = K
 
	def predicted(self):
		if os.path.exists(self.path42) == True:
			much = shutil.rmtree(self.path42)
			os.mkdir(self.path42)
		else:
			os.mkdir(self.path42)
		os.chdir(self.path42)
		for i in range(self.K):			#创建K个文件夹
			os.mkdir('classify{}'.format(i))
		for i,j in enumerate(self.cluster):
			skimage.io.imsave('classify{}\\{}'.format(j,self.diff[i][0]),self.diff[i][1])	#根据图片的分类来将它们保存至对应的文件夹
 
if __name__=="__main__":
	np.random.seed(10)
	#文件路径添加
	start = Path()
	pathlist = start.append()
 
	#对比度类
	second = Contrast(pathlist)
	second.balance()	#get改变对比度后的图片个数
 
	#高斯过滤
	filte = Filter(pathlist)
	filter_path = filte.filte_r()
 
	#数据提取及向量化
	vectoring = Vectoring(filter_path)
 
	#K值的自定义
	K = 3
 
	#建模
	modeling = Modeling(filter_path,K)
	predicted_diff,predicted_cluster = modeling.model()
 
	#预测
	predicted = Predicting(predicted_diff,predicted_cluster,K)
	predicted.predicted()

文件如下:

python数据处理 根据颜色对图片进行分类的方法

(K=3)分类如下(picrure4):

python数据处理 根据颜色对图片进行分类的方法

python数据处理 根据颜色对图片进行分类的方法

白色的基本在一类

python数据处理 根据颜色对图片进行分类的方法

黑色的基本一类

分类出来的图片比较模糊是因为,我分类的是处理过后的图片,并非原图。

其实仔细看效果还是有的,就是确实不是太明显,图片的内容还是有点复杂的。大体的框架已经有了,只是优化的问题,调整优化,以及向量特征化的处理,就能得到更好的结果。或者使用一些更好的处理方式,我这里只是简单的使用了几种常见的图片处理方式,所以效果一般。

这里的类有点多,从上到下是类的顺序,所以一步步看还是不复杂的。如果有什么好的建议可以分享一下。

以上这篇python数据处理 根据颜色对图片进行分类的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现Sqlite将字段当做索引进行查询的方法
Jul 21 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
python文件写入write()的操作
May 14 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
wxPython实现列表增删改查功能
Nov 19 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
Mar 12 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 Python
python字典按照value排序方法
Dec 28 Python
Python中的pprint模块
Nov 27 Python
Python实现简单得递归下降Parser
May 02 Python
Python发送邮件测试报告操作实例详解
Dec 08 #Python
Python自动发送邮件的方法实例总结
Dec 08 #Python
Python数据集切分实例
Dec 08 #Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 #Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 #Python
pandas求两个表格不相交的集合方法
Dec 08 #Python
对pytorch网络层结构的数组化详解
Dec 08 #Python
You might like
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
python绘制条形图方法代码详解
2017/12/19 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
pandas数据集的端到端处理
2019/02/18 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
一位农村小子的自荐信
2014/04/07 职场文书
安全责任书模板
2014/07/22 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
现实表现材料范文
2014/12/23 职场文书
行政答辩状范文
2015/05/21 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL
TS 类型收窄教程示例详解
2022/09/23 Javascript