Extraindo cores dominantes de uma imagem com Python

Suzana Mota
3 min readMar 7, 2021

--

Quem nunca viu uma cena linda de cinema e gostaria de saber qual é a paleta de cores que foi utilizada? Ou se inspirou em alguma imagem do Pinterest e queria muuuuito saber quais são as cores exatas utilizadas ali?

Com a biblioteca colorgram, isso se torna uma tarefa fácil. Nós ja vimos alguns artigos sobre espaços de cores e o funcionamento do espaço de cores RGB, hoje vamos aprender a extrair as cores dominantes de uma imagem, utilizando a lib colorgram.

Para começar é bem simples, primeiro instale a lib colorgram com os comandos:

pip install colorgram

1. Obter cores Dominantes

Para isso, a gente só precisa definir quantas cores dominantes, gostaríamos de extrair. Neste caso, estamos utilizando como padrão 6 cores dominantes. Lembrando que o colorgram, traz as cores na ordem de “dominancia”, ou seja, a primeira cor da lista é a mais dominante e assim sucessivamente.

import colorgram
import argparse
import sys
from PIL import Image, ImageDraw, ImageFont
def get_colors(image_file, numcolors=6):
# Extract dominant colors from an image.
colors = colorgram.extract(image_file, numcolors)
return colors

2. Criar paleta de cores dominantes

Para isso vamos criar alguns retangulos com cada uma das cores dominantes e vamos escrever as cores RGB de cada uma.

def save_palette(colors, swatchsize=100, outfile="palette.png"):
num_colors = len(colors)
image_palette = Image.new('RGB', (swatchsize * num_colors, swatchsize))
print(image_palette)
draw = ImageDraw.Draw(image_palette)
font = ImageFont.truetype('font/lmmonoproplt10-bold.otf', 15)
posx = 0
count_color = 0
for color in colors:
txt = str(color.rgb.r) + "," + str(color.rgb.g) + "," + str(
color.rgb.b)
print(
f"Color {count_color}: ({color.rgb.r},{color.rgb.g},{color.rgb.b})"
)
draw.rectangle([posx, 0, posx + swatchsize, swatchsize],
fill=(color.rgb.r, color.rgb.g, color.rgb.b))
draw.text((posx + 10, 0, posx + swatchsize), txt, font=font)
posx = posx + swatchsize
count_color = count_color + 1
image_palette.show()
image_palette.save(outfile, "PNG")

3. Recebendo os parâmetros de entrada

No nosso código vamos receber a imagem de entrada, onde as cores dominantes serão buscadas e a imagem de saída, que é salva com a nossa paleta de cores.

if __name__ == '__main__':
input_file = sys.argv[1]
output_file = sys.argv[2]
colors = get_colors(input_file)
save_palette(colors, outfile=output_file)

Agora você já consegue rodar o seu próprio teste! Utilize o código completo abaixo e encontre a paleta de cores exata, que você procura!

Código Completo

import colorgram
import argparse
import sys
from PIL import Image, ImageDraw, ImageFont
def get_colors(image_file, numcolors=6):
# Extract dominant colors from an image.
colors = colorgram.extract(image_file, numcolors)
return colorsdef save_palette(colors, swatchsize=100, outfile="palette.png"):
num_colors = len(colors)
image_palette = Image.new('RGB', (swatchsize * num_colors, swatchsize))
print(image_palette)
draw = ImageDraw.Draw(image_palette)
font = ImageFont.truetype('font/lmmonoproplt10-bold.otf', 15)
posx = 0
count_color = 0
for color in colors:
txt = str(color.rgb.r) + "," + str(color.rgb.g) + "," + str(
color.rgb.b)
print(
f"Color {count_color}: ({color.rgb.r},{color.rgb.g},{color.rgb.b})"
)
draw.rectangle([posx, 0, posx + swatchsize, swatchsize],
fill=(color.rgb.r, color.rgb.g, color.rgb.b))
draw.text((posx + 10, 0, posx + swatchsize), txt, font=font)
posx = posx + swatchsize
count_color = count_color + 1
image_palette.show()
image_palette.save(outfile, "PNG")
if __name__ == '__main__':
input_file = sys.argv[1]
output_file = sys.argv[2]
colors = get_colors(input_file)
save_palette(colors, outfile=output_file)

--

--