使用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进行数据科学工作的简单入门教程
Apr 01 Python
Python算法应用实战之队列详解
Feb 04 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 Python
python之super的使用小结
Aug 13 Python
在Python中使用Neo4j的方法
Mar 14 Python
python使用threading.Condition交替打印两个字符
May 07 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
anaconda如何查看并管理python环境
Jul 05 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
pycharm的python_stubs问题
Apr 08 Python
Python实现加密接口测试方法步骤详解
Jun 05 Python
python实现经纬度采样的示例代码
Dec 10 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图像处理类代码分享
2012/01/19 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
JS下拉框内容左右移动效果的具体实现
2013/07/10 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
vuex 的简单使用
2018/03/22 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
对python模块中多个类的用法详解
2019/01/10 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
附答案的Java面试题
2012/11/19 面试题
财务人员个人自荐信范文
2013/09/26 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
珍爱生命主题班会
2015/08/13 职场文书
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL
python turtle绘图命令及案例
2021/11/23 Python
Python中itertools库的四个函数介绍
2022/04/06 Python