Extraindo cores dominantes de uma imagem com Python
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, ImageFontdef 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 + 1image_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, ImageFontdef 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 + 1image_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)