使用Python的PIL模块来进行图片对比

在使用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')

最新文章

  1. C# 以附加文件方式连接SQL Server数据库文件
  2. linux 执行php文件
  3. SVN命令收集
  4. [译]rabbitmq 2.5 Where’s my message? Durability and you
  5. android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明
  6. Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
  7. BZOJ_1600_[Usaco2008_Oct]_建造栅栏_(动态规划)
  8. Android 中HttpClient和HttpURLConnection选取
  9. Python获取Origin官网视频
  10. get_class __class__ get_called_class 分析记录
  11. 使用logstash同步mysql数据到elasticsearch
  12. 百度UEditor粘贴或插入的表格不显示边框的解决办法
  13. Memcached学习一:Memcached安装使用
  14. nodejs 如何操作字节在内存中的位置问题 BE LE
  15. free命令中的buffer和cached的比较(转)
  16. Android源码中final关键字的用法及final,finally,finalize的区别
  17. winform c#中子窗体关闭刷新父窗体
  18. Android DiskLruCache完全解析,硬盘缓存的最佳方案
  19. 非ie浏览器必备函数常识
  20. Windows窗体技术及基础控件

热门文章

  1. Powershell read XML format config file
  2. jmeter:清除本地指定目录下的所有类型文件
  3. TCP协议分析(包结构)---转
  4. Dedecms织梦后台登陆验证码不显示几种解决方法
  5. k3 cloud中库存转移处理
  6. mysql 8.0.15忘记密码重置方法
  7. JavaScript设计模式-组合模式(表单应用实现)
  8. vue,一路走来(7)--响应路由参数的变化
  9. qt如何去掉文件路径最后一个反斜杠的内容
  10. PL SQL安装