使用Python的PIL模块来进行图片对比


Posted in Python onFebruary 18, 2016

在使用google或者baidu搜图的时候会发现有一个图片颜色选项,感觉非常有意思,有人可能会想这肯定是人为的去划分的,呵呵,有这种可能,但是估计人会累死, 开个玩笑,当然是通过机器识别的,海量的图片只有机器识别才能做到。
那用python能不能实现这种功能呢?答案是:能

利用python的PIL模块的强大的图像处理功能就可以做到,下面上代码:

import colorsys

def get_dominant_color(image):

#颜色模式转换,以便输出rgb颜色值
  image = image.convert('RGBA')

#生成缩略图,减少计算量,减小cpu压力
  image.thumbnail((200, 200))

  max_score = None
  dominant_color = None

  for count, (r, g, b, a) in image.getcolors(image.size[0] * image.size[1]):
    # 跳过纯黑色
    if a == 0:
      continue

    saturation = colorsys.rgb_to_hsv(r / 255.0, g / 255.0, b / 255.0)[1]

    y = min(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235)

    y = (y - 16.0) / (235 - 16)

    # 忽略高亮色
    if y > 0.9:
      continue

    # Calculate the score, preferring highly saturated colors.
    # Add 0.1 to the saturation so we don't completely ignore grayscale
    # colors by multiplying the count by zero, but still give them a low
    # weight.
    score = (saturation + 0.1) * count

    if score > max_score:
      max_score = score
      dominant_color = (r, g, b)

  return dominant_color

如何使用:

from PIL import Image

print get_dominant_color(Image.open('logo.jpg'))

这样就会返回一个rgb颜色,但是这个值是很精确的范围,那我们如何实现百度图片那样的色域呢??
其实方法很简单,r/g/b都是0-255的值,我们只要把这三个值分别划分相等的区间,然后组合,取近似值。例如:划分为0-127,和128-255,然后自由组 合,可以出现八种组合,然后从中挑出比较有代表性的颜色即可。
当然我只是举一个例子,你也可以划分的更细,那样显示的颜色就会更准确~~大家赶快试试吧

PS:通过pil生成缩略图的简单代码

如果是单纯地生成缩略图,我们可以通过pil很简单地办到,这段代码会强行将图片大小修改成250x156:

from PIL import Image
img = Image.open('sharejs.jpg')
img = img.resize((250, 156), Image.ANTIALIAS)
img.save('sharejs_small.jpg')
Python 相关文章推荐
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
Jul 09 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
基于python实现简单日历
Jul 28 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
关于PyTorch源码解读之torchvision.models
Aug 17 Python
python中setuptools的作用是什么
Jun 19 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
Jul 03 Python
python实现自动化群控的步骤
Apr 11 Python
PyTorch device与cuda.device用法
Apr 03 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 #Python
python装饰器与递归算法详解
Feb 18 #Python
Python利用Nagios增加微信报警通知的功能
Feb 18 #Python
Python多线程、异步+多进程爬虫实现代码
Feb 17 #Python
玩转python爬虫之爬取糗事百科段子
Feb 17 #Python
玩转python爬虫之正则表达式
Feb 17 #Python
玩转python爬虫之URLError异常处理
Feb 17 #Python
You might like
第1次亲密接触PHP5(2)
2006/10/09 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
定义select的边框颜色
2008/04/28 Javascript
JavaScript中的pow()方法使用详解
2015/06/15 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
layui文件上传实现代码
2017/05/20 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
JS前端广告拦截实现原理解析
2020/02/17 Javascript
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
Python读取Excel的方法实例分析
2015/07/11 Python
使用python绘制常用的图表
2016/08/27 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
奥地利网上书店:Weltbild
2017/07/14 全球购物
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
司马光教学反思
2014/02/01 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
产品发布会策划方案
2014/05/12 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
2015年教师教学工作总结
2015/04/28 职场文书