使用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复制文件的方法实例详解
May 22 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
详解Python map函数及Python map()函数的用法
Nov 16 Python
python实现简易云音乐播放器
Jan 04 Python
python通过微信发送邮件实现电脑关机
Jun 20 Python
使用python生成杨辉三角形的示例代码
Aug 29 Python
Python 实现子类获取父类的类成员方法
Jan 11 Python
python实现tail -f 功能
Jan 17 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
python else语句在循环中的运用详解
Jul 06 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
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
ThinkPHP中的常用查询语言汇总
2014/08/22 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
常用的js方法合集
2017/03/10 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
Python编程实现蚁群算法详解
2017/11/13 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
军训自我鉴定100字
2014/02/13 职场文书
给校长的建议书500字
2014/05/15 职场文书
七一表彰大会简报
2015/07/20 职场文书
心理学培训心得体会
2016/01/22 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python