使用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的Flask框架与数据库连接的教程
Apr 20 Python
最基础的Python的socket编程入门教程
Apr 23 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
Python和Go语言的区别总结
Feb 20 Python
Django中URL的参数传递的实现
Aug 04 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
python中if嵌套命令实例讲解
Feb 25 Python
Python基础之元编程知识总结
May 23 Python
python基础之错误和异常处理
Oct 24 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
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
2015/02/02 Javascript
javascript定时器完整实例
2015/02/10 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
node跨域请求方法小结
2017/08/25 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
简历上的自我评价
2014/02/03 职场文书
学员自我鉴定
2014/03/19 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
任命书范本大全
2014/06/06 职场文书
大学计划书范文800字
2014/08/14 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
Python日志模块logging用法
2022/06/05 Python