Skip to content

Instantly share code, notes, and snippets.

@nathforge
Created November 1, 2010 15:22

Revisions

  1. nathforge revised this gist Nov 1, 2010. 1 changed file with 17 additions and 9 deletions.
    26 changes: 17 additions & 9 deletions gistfile1.py
    Original file line number Diff line number Diff line change
    @@ -1,28 +1,36 @@
    import colorsys

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

    image = image.convert('RGB')
    image = image.convert('RGBA')

    # Shrink the image so we don't spend too long analysing color frequencies.
    # 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) in image.getcolors(image.size[0] * image.size[1]):
    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
    luminance = min(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235)
    # 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
    luminance = (luminance - 16.0) / (235 - 16)
    y = (y - 16.0) / (235 - 16)

    # Ignore extremely bright colors
    if luminance > 0.9:
    # Ignore the brightest colors
    if y > 0.9:
    continue

    # Calculate the score, preferring highly saturated colors.
  2. @invalid-email-address Anonymous created this gist Nov 1, 2010.
    38 changes: 38 additions & 0 deletions gistfile1.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    def get_dominant_color(image):
    """
    Find an image's dominant color.
    """

    image = image.convert('RGB')

    # Shrink the image so we don't spend too long analysing color frequencies.
    image.thumbnail((200, 200))

    max_score = None
    dominant_color = None

    for count, (r, g, b) in image.getcolors(image.size[0] * image.size[1]):
    # 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
    luminance = min(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235)

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

    # Ignore extremely bright colors
    if luminance > 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