O que você precisa saber antes de começar
A classificação das cores não é um processo mágico, é uma sequência de decisões técnicas que depende do contexto em que você vai usar o resultado. Se você está fazendo isso para design gráfico, o caminho é diferente de quem faz para visão computacional ou controle de qualidade industrial. A confusão começa aí. Muita gente pula direto para ferramentas sem decidir qual sistema de cor vai adotar. Eu recomendo começar pelo sistema. RGB, CMYK, HSL, HSV, LAB, YCbCr — cada um tem um propósito. RGB é para telas. CMYK para impressão. LAB para medições que precisam ser independentes de dispositivo. Se você está classificando cores em um projeto de pesquisa ou em produção, o mais seguro é trabalhar com LAB porque as dimensões L, a e b separam brilho de informação cromática de forma mais próxima da percepção humana. Isso evita problemas como dois azuis que parecem iguais para uma máquina mas são diferentes para um olho humano.
Classificação das cores na prática
O fluxo básico funciona assim: capturar a cor, converter para o espaço adequado, calcular a distância entre cores e agrupar com base nessa métrica. O passo que todo mundo erra é a conversão. Transformar RGB direto em classes sem passar por um espaço perceptualmente uniforme gera erros sistemáticos. Cores com brilho diferente acabam sendo separadas como se fossem matizes completamente distintas, o que não faz sentido para classificação. No meu caso, trabalhei num projeto onde precisávamos classificar tecidos por tonalidade para controle de lote. O problema era que lotes diferentes do mesmo azul apareciam como classes distintas porque a iluminação variava entre a coleta e a verificação. A solução foi converter tudo para CIELAB e usar apenas os eixos a e b para a classificação, ignorando o eixo L que carregava a variação de brilho causada pela iluminação. Reduzimos o taxa de erro de cerca de 18% para menos de 4%. Levei duas semanas para ajustar o white point do referencial D65 corretamente no software.
Para a etapa de agrupamento, k-means é o método mais comum e funciona bem quando você já sabe quantas classes quer. O problema é que k-means assume esferas de mesma variância, o que nem sempre é verdade para distribuições de cores reais. Eu costumo usar o DBSCAN como alternativa quando os dados vêm com ruído significativo — manchas, variações de iluminação, textura irregular no material analisado. Ele identifica outliers naturalmente e não exige que você defina o número de classes antecipadamente. Se você quer implementar rápido, aqui vai um esqueleto funcional em Python usando scikit-learn:
👉 Clique no botão abaixo para saber mais sobre o assunto!
import numpy as np from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from colorspacious import cspace_convert imagens RGB de 0-255 rgb_image = np.array(...) sua imagem aqui pixels = rgb_image.reshape(-1, 3) lab_pixels = cspace_convert(pixels, "RGB", "CIELAB") a_b = lab_pixels[:, 1:] scaler = StandardScaler() a_b_scaled = scaler.fit_transform(a_b) kmeans = KMeans(n_clusters=5, random_state=42, n_init=10) classes = kmeans.fit_predict(a_b_scaled)
Esse código retorna um array onde cada pixel recebeu um índice de classe baseado apenas nas componentes cromáticas. O StandardScaler é importante porque os eixos a e b têm escalas diferentes, e o k-means é sensível a isso. Um detalhe que poucos mencionam: a escolha do número de clusters não deve ser feita por chute. Use o método do cotovelo ou silhouette score no espaço CIELAB. O cotovelo costuma dar um ponto de inflexão claro quando há variações cromáticas reais nos dados. Se o gráfico ficar plano, significa que suas cores estão praticamente uniformes e a classificação perde sentido.
Limitações que ninguém gosta de ouvir
Classificação de cores por clustering puro falha completamente quando o material analisado tem padrão, textura ou gradientes. Um tecido listrado ou uma superfície metálica vão gerar centenas de clusters que não correspondem a nenhuma categoria útil. Nesses casos, você precisa primeiro normalizar a iluminacão ou usar segmentação por região antes de extrair as cores dominantes. Extrair a cor média de cada região homogênea e depois classificar essas médias funciona muito melhor do que clusterizar todos os pixels de uma vez. Também vale avisar: CIELAB não é perfeito. Ele foi projetado para diferenças pequenas entre cores próximas, e a precisão cai quando você compara cores muito distantes no espaço. Se o seu projeto envolve classificar desde tons pastel até cores saturadas escuras num único modelo, considere usar CAM02-UCS, uma versão mais recente que corrige essas inconsistências. O custo computacional é maior, mas a diferença é real.
Para quem precisa de resultados prontos sem programar, existem ferramentas como theColor (thecolor.ai) e Paletton que ajudam a visualizar classificações, mas elas operam em espaços próprios e não são reproduzíveis para uso industrial. Se você precisa de consistência entre rodadas de classificação, construa o seu pipeline com bibliotecas abertas. O download das dependências pode ser feito via pip install colorspacious scikit-learn numpy, que instala tudo que o exemplo acima precisa. A versão do colorspacious importa — use a 2.1.1 ou superior para ter suporte confiável a conversões para CIELAB.