Pergunta

Como faço para converter os valores RGB de um pixel em um único valor monocromático?

Foi útil?

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.

https://www.mathworks.com/examples/image/mw/images-ex71219044-color-based-segmentation-using-k-means-clustering

Imagem original em cores.

Picture with colours

Depois de converter para monocromático usando cluster k-means Picture after converting to monochrome using k-means clustering

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top