通过Python得到一张图片或logo的主要颜色

Wednesday, November 3, 2010

看到一篇博客Pick the dominant colour from a logo using
Python
,一段代码实现了该功能,
效果还不错, 我把代码稍微完善了一下, 方便测试 :-)

python pick_dominant_color.py -f xxx.gif

# -*- coding: utf-8 -*-

import colorsys
from PIL import Image
import optparse


def get_dominant_color(image):
    """
   Find a PIL image's dominant color, returning an (r, g, b) tuple.
   """

    image = image.convert('RGBA')

    # Shrink the image, so we don't spend too long analysing color
    # frequencies. We're not interpolating so should be quick.
    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]):
        # Skip 100% transparent pixels
        if a == 0:
            continue

        # Get color saturation, 0-1
        saturation = colorsys.rgb_to_hsv(r / 255.0, g / 255.0, b / 255.0)[1]

        # Calculate luminance - integer YUV conversion from
        # http://en.wikipedia.org/wiki/YUV
        y = min(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235)

        # Rescale luminance from 16-235 to 0-1
        y = (y - 16.0) / (235 - 16)

        # Ignore the brightest colors
        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

def main():
    usage = 'usage: %prog -f filepath'
    parser = optparse.OptionParser(usage)
    parser.add_option('-f', '--filepath', dest='filepath', help='-f filepath', type='string')
    (options, args) = parser.parse_args()
    if options.filepath == None:
        parser.error('must has -f option!')
    try:
        img = Image.open(options.filepath)
    except:
        print("can not open the file")
        return

    print '#%02x%02x%02x' % get_dominant_color(img)

if __name__ == '__main__':
    main()

This entry was tagged Python

comments powered by Disqus

© 2009-2013 lxneng.com. All rights reserved. Powered by Pyramid

go to Top