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生成文件md5校验值函数的方法
Jan 10 Python
关于Python中Inf与Nan的判断问题详解
Feb 08 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
python实现搜索文本文件内容脚本
Jun 22 Python
Linux下多个Python版本安装教程
Aug 15 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
pytorch 求网络模型参数实例
Dec 30 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
Python unittest discover批量执行代码实例
Sep 08 Python
python绘图subplots函数使用模板的示例代码
Apr 30 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 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文件中是否含有bom的函数
2012/05/31 PHP
php中Snoopy类用法实例
2015/06/19 PHP
JavaScript 事件记录使用说明
2009/10/20 Javascript
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
首页图片漂浮效果示例代码
2014/06/05 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
python实现socket端口重定向示例
2014/02/10 Python
Python struct模块解析
2014/06/12 Python
python快速查找算法应用实例
2014/09/26 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Django实现组合搜索的方法示例
2018/01/23 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
python -v 报错问题的解决方法
2020/09/15 Python
纯CSS3制作页面切换效果的实例代码
2019/05/30 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
写求职信要注意什么问题
2014/04/12 职场文书
辩论会主持词
2015/07/03 职场文书
学子宴致辞大全
2015/07/27 职场文书
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL
Springboot中如何自动转JSON输出
2022/06/16 Java/Android
Python如何加载模型并查看网络
2022/07/15 Python
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python