使用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连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
Python isinstance函数介绍
Apr 14 Python
Python实现端口检测的方法
Jul 24 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
Python 实现微信防撤回功能
Apr 29 Python
Django学习笔记之为Model添加Action
Apr 30 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
python中导入 train_test_split提示错误的解决
Jun 19 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python区块链持久化和命令行接口实现简版
May 25 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
自己动手做一个SQL解释器
2006/10/09 PHP
PHP怎样调用MSSQL的存储过程
2006/10/09 PHP
windows xp下安装pear
2006/12/02 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
javascript 闭包详解及简单实例应用
2016/12/31 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
webpack的tree shaking的实现方法
2019/09/18 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
python引用DLL文件的方法
2015/05/11 Python
Python字符编码判断方法分析
2016/07/01 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
毕业生写求职信的要点
2014/03/04 职场文书
承诺书的格式范文
2014/03/28 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
师德先进个人材料
2014/12/20 职场文书
员工家属慰问信
2015/03/24 职场文书
行政撤诉申请书
2015/05/18 职场文书
西柏坡观后感
2015/06/08 职场文书
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python