Conversão RGB para monocromático
-
08-06-2019 - |
Pergunta
Como faço para converter os valores RGB de um pixel em um único valor monocromático?
Solução
Encontrei uma solução possível no Perguntas frequentes sobre cores.O componente de luminância Y (do Sistema CIEXYZ) captura o que é mais percebido pelos humanos como cor em um canal.Então, use esses coeficientes:
mono = (0.2125 * color.r) + (0.7154 * color.g) + (0.0721 * color.b);
Outras dicas
Este artigo do MSDN usa (0.299 * color.R + 0.587 * color.G + 0.114 * color.B);
Este artigo da Wikipédia usa (0.3* color.R + 0.59 * color.G + 0.11 * color.B);
Esse artigo científico recente compara o que há de mais moderno na conversão de fotografias coloridas em tons de cinza, incluindo a fórmula simples de luminância e técnicas mais complexas.
Isso depende de quais são suas motivações.Se você deseja apenas transformar uma imagem arbitrária em tons de cinza e deixá-la com uma boa aparência, as conversões em outras respostas a esta pergunta servirão.
Se você estiver convertendo fotografias coloridas em preto e branco, o processo pode ser muito complicado e subjetivo, exigindo ajustes específicos para cada imagem.Para ter uma ideia do que pode estar envolvido, dê uma olhada neste tutorial da Adobe para Photoshop.
Replicar isso em código seria bastante complicado e ainda exigiria a intervenção do usuário para obter a imagem resultante esteticamente "perfeita" (seja lá o que isso signifique!).
Como mencionado também, uma tradução em escala de cinza (observe que as imagens monocromáticas não precisam estar em escala de cinza) de um tripleto RGB está sujeita a gosto.
Por exemplo, você pode trapacear, extrair apenas o componente azul, simplesmente jogando fora os componentes vermelho e verde e copiando o valor azul em seu lugar.Outra solução simples e geralmente boa seria pegar a média do triplo RGB do pixel e usar esse valor em todos os três componentes.
O fato de haver um mercado considerável para plug-ins de conversão de tons de cinza/monocromáticos profissionais e não muito baratos, não-sirree, apenas para o Photoshop, indica que a conversão é tão simples ou complexa quanto você desejar.
A lógica por trás da conversão de qualquer imagem baseada em RGB em monocromática não é uma transformação linear trivial.Na minha opinião, esse problema é melhor resolvido pelas técnicas de "segmentação de cores".Você pode obter "segmentação de cores" por meio do agrupamento k-means.
Veja o exemplo de referência do site MathWorks.
Imagem original em cores.
Depois de converter para monocromático usando cluster k-means
Como é que isso funciona?
Colete todos os valores de pixel da imagem inteira.A partir de uma imagem com W pixels de largura e H pixels de altura, você obterá valores de cores W *H.Agora, usando o algoritmo k-means, crie 2 clusters (ou caixas) e jogue as cores nas "caixas" apropriadas.Os 2 clusters representam seus tons de preto e branco.
Vídeo do Youtube demonstrando segmentação de imagens usando k-means? https://www.youtube.com/watch?v=yR7k19YBqiw
Desafios com este método
O algoritmo de agrupamento k-means é suscetível a valores discrepantes.Alguns pixels aleatórios com uma cor cuja distância RGB esteja longe do resto da multidão podem facilmente distorcer os centróides para produzir resultados inesperados.