Python通过PIL获取图片主要颜色并和颜色库进行对比的方法


Posted in Python onMarch 19, 2015

本文实例讲述了Python通过PIL获取图片主要颜色并和颜色库进行对比的方法。分享给大家供大家参考。具体分析如下:

这段代码主要用来从图片提取其主要颜色,类似Goolge和Baidu的图片搜索时可以指定按照颜色搜索,所以我们先需要将每张图片的主要颜色提取出来,然后将颜色划分到与其最接近的颜色段上,然后就可以按照颜色搜索了。

在使用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,然后自由组合,可以出现八种组合,然后从中挑出比较有代表性的颜色即可。

当然我只是举一个例子,你也可以划分的更细,那样显示的颜色就会更准确~~大家赶快试试吧

希望本文所述对大家的python程序设计有所帮助。

Python 相关文章推荐
使用python检测手机QQ在线状态的脚本代码
Feb 10 Python
centos 下面安装python2.7 +pip +mysqld
Nov 18 Python
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
Python中使用__new__实现单例模式并解析
Jun 25 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 Python
Python pygame绘制文字制作滚动文字过程解析
Dec 12 Python
Softmax函数原理及Python实现过程解析
May 22 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
python中if和elif的区别介绍
Nov 07 Python
Python实现简单状态框架的方法
Mar 19 #Python
python中日期和时间格式化输出的方法小结
Mar 19 #Python
Python实现抓取城市的PM2.5浓度和排名
Mar 19 #Python
python在windows命令行下输出彩色文字的方法
Mar 19 #Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 #Python
python实现颜色rgb和hex相互转换的函数
Mar 19 #Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
Mar 19 #Python
You might like
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
ThinkPHP之getField详解
2014/06/20 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
javascript 节点遍历函数
2010/03/28 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
《我要的是葫芦》教学反思
2014/02/23 职场文书
开发房地产协议书
2014/09/14 职场文书
员工保密协议书
2014/09/27 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
Python 内置函数速查表一览
2021/06/02 Python
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA