使用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中Collection的使用小技巧
Aug 18 Python
深入理解python中的闭包和装饰器
Jun 12 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
Python使用matplotlib绘制随机漫步图
Aug 27 Python
python的常用模块之collections模块详解
Dec 06 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
Python 实现大整数乘法算法的示例代码
Sep 17 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
python实现超级马里奥
Mar 18 Python
python中绕过反爬虫的方法总结
Nov 25 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
Jan 15 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解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
一段实时更新的时间代码
2006/07/07 Javascript
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
2018/08/17 Javascript
nodejs 使用http进行post或get请求的实例(携带cookie)
2019/01/03 NodeJs
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
python&MongoDB爬取图书馆借阅记录
2016/02/05 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
艺术专业大学生自我评价
2013/09/22 职场文书
小学生优秀评语大全
2014/04/22 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
志愿者个人总结
2015/03/03 职场文书
《学会看病》教学反思
2016/02/17 职场文书
先进个人事迹材料(2016推荐版)
2016/03/01 职场文书
倡议书怎么写?
2019/04/11 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python