Algoritmo para reconhecimento de cores

1,302 views
Skip to first unread message

Hugo Marques

unread,
Oct 3, 2011, 8:13:26 AM10/3/11
to pb...@googlegroups.com
Bom dia a todos,

Alguém conhece ou sabe me dizer onde posso achar um algoritmo/técnica para reconhecer as cores que compõem uma imagem?

Desde já agradeço qualquer ajuda,

-- 
Hugo Marques
System Analyst
OCJP - Oracle Certified JAVA Programmer

Marcelo Zurita

unread,
Oct 3, 2011, 8:44:23 AM10/3/11
to pb...@googlegroups.com
Hugo, não entendi exatamente o que você quer. Saber a cor de cada pixel ou criar uma matriz de cores da imagem?

Atenciosamente,

Marcelo Zurita
mzu...@cnnt.com.br
83 9926 1152

--------------------------------------
Connect Soluções Integradas
Ed. Maximum Shopping Empresarial
Av. Juarez Távora, 522, sala 716
Torre - João Pessoa - Paraíba
www.cnnt.com.br
83 3243 0931


--
Você está recebendo esta mensagem porque se inscreveu no grupo "PBJug" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para pb...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para pbjug+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/pbjug?hl=pt-BR.

Hugo Marques

unread,
Oct 3, 2011, 8:53:40 AM10/3/11
to pb...@googlegroups.com
Marcelo,

O objetivo é o seguinte: dado que eu tenha uma imagem, identificar quais as cores presentes nela, ou seja, se a mesma contém a cor verde ou azul, algo neste sentido.

Atenciosamente,

Hugo Marques

2011/10/3 Marcelo Zurita <mzu...@cnnt.com.br>

Luciano Logrado

unread,
Oct 3, 2011, 9:12:43 AM10/3/11
to pb...@googlegroups.com
veja o javadoc da Class BufferedImage, nele pode o que está procurando.

Em 3 de outubro de 2011 09:53, Hugo Marques
<hugomarq...@gmail.com> escreveu:

Thiago Paulino

unread,
Oct 3, 2011, 9:17:21 AM10/3/11
to pb...@googlegroups.com
BufferedImage imagem [...]
int rgb = imagem.getRGB(x, y); //x e y são as coordenadas da matriz de pixels da imagem

É isso aí que vc ta procurando?

Com o valor do RGB em mãos aí você trata como quiser.

Hugo Marques

unread,
Oct 3, 2011, 9:26:12 AM10/3/11
to pb...@googlegroups.com
Entendi mas e se for o caso de pegar a matriz de pixels da imagem?

Existe alguma técnica que determina que um folha um pouco amarelada ainda é considerada verde? Digo, 10% da folha está amarela mas o resto é verde. Analisando pixel a pixel teríamos pixels da cor verde, amarela e talvez até de outras cores. 

Existe alguma convenção para determinar que a cor da folha em si seria verde?

Atenciosamente,

Hugo Marques

2011/10/3 Thiago Paulino <thiagop...@gmail.com>

Thiago Sousa Santos

unread,
Oct 3, 2011, 9:36:16 AM10/3/11
to pb...@googlegroups.com
Não sou especialista no assunto, mas algo que me parece simples de fazer que pode funcionar é fazer algum tipo de segmentação por cores na imagem, reduzindo a quantidade de cores.

Por exemplo, se você usa 1 byte para cada canal RGB, você tem 255 possibilidades para cada canal. Reduzir este espaço para 8 possibilidades, aproximando os valores vai te dar uma menor quantidade de cores possíveis. A partir daí você pode segmentar (agrupar regiões de cores semelhantes/iguais) e usar algum tipo de decisão para ver qual cor predomina (média ponderada, por exemplo).

Obviamente não sei nada sobre o seu objetivo final, nem seu tipo de imagem de entrada, mas espero ter ajudado.

[]

2011/10/3 Hugo Marques <hugomarq...@gmail.com>



--
Thiago Sousa Santos

Thiago Paulino

unread,
Oct 3, 2011, 10:41:08 AM10/3/11
to pb...@googlegroups.com
Hugo, aí vai depender do seu objetivo, como disse o Thiago Sousa.

Com isso aí você pode varrer toda a imagem, pegando a cor de cada pixel.
Pra saber, por exemplo, se 10% da folha está verde ou amarelo aí você é que determina no seu algoritmo. Depende do seu objetivo, o que tu queres fazer exatamente?

Eu já escrevi um post no meu blog onde eu falei um pouco sobre processamento de imagens, talvez ajude em alguma coisa: http://goo.gl/7irZ6

André Costa

unread,
Oct 3, 2011, 4:30:13 PM10/3/11
to pb...@googlegroups.com
Já me deparei com este problema anteriormente e não achei tão simples como parecia ser.

Vamos, primeiro, para o caso mais simples: uma figura com poucas cores (ex. desenhos).
Nesse caso o que pode ser feito é percorrer os pixels da imagem, montando um conjunto de cores encontradas. No entanto, as cores de cada pixel serão triplas RGB. Se quiser transformá-las em texto (ex. (255, 0, 0) para "vermelho"), cria um "banco" de cores e encontra a cor mais "próxima" usando esta técnica: http://en.wikipedia.org/wiki/Color_difference.

Já no caso mais complexo, as imagens possuem muitas cores diferentes (mas semelhantes) (ex. fotos).
Na foto de uma folha, por exemplo, existem muitas tonalidades de verde (e de amarelo). Perceba que não necessariamente existe o verde puro (0, 255, 0). Para os nossos olhos, esses são todos verdes, mas para o computador, cada um é uma cor diferente, isso impede de usarmos o mesmo método de antes.

O que pode ser feito então? Depende da saída esperada e das imagens utilizadas. Por isso que é importante detalhar o seu problema.

Se, no caso que você citou (10% da folha está amarela mas o resto é verde), você quiser que o algoritmo diga que a imagem tem amarelo, talvez usar o método pras imagens mais simples dê certo, porque tons RGB de verde levemente diferentes possivelmente levarão para o mesmo verde. Se quiser que diga que só tem verde, você precisará de uma forma de desconsiderar o amarelo. Pode ser por algum algoritmo de segmentação (deve obter um resultado melho) ou remoção de ruído, usando o filtro da média ou mediana, reduzindo o tamanho da imagem ou a quantidade de cores (como Thiago Santos disse). Perceba que a aplicação destes métodos procura "simplificar" a imagem (reduzindo-a para o primeiro caso).

Até onde eu pesquisei, esse ainda é um problema em aberto. Vai ser difícil achar um algoritmo perfeito, então o jeito é experimentar com as imagens de entrada e ver qual método se sai melhor.

Escrevendo esse email, percebi que talvez dê pra utilizar alguma técnica de aprendizado de máquina pra detectar as cores. Não conheço muito dessa área, mas é algo a se pensar.

Abraços,
André Costa

João Felipe Silva Ouriques

unread,
Oct 4, 2011, 8:19:36 AM10/4/11
to pb...@googlegroups.com
O espaço de cores RGB é tridimensional, ou seja três coordenadas determinam um ponto nele, mas mais simples porque tem valor mínimo e máximo, o que nos diz que o espaço tridimensional é delimitado por um cubo de aresta 255 (pensando na representação do computador).

Em cada vértice do cubo está uma cor pura, como podemos ver na figura imagem7.JPG

É possível pensar em uma abordagem vetorial para o tratamento de diferença de cores, estipulando limites de distância euclidiana entre os vetores, definindo assim o que seria uma cor diferente. Exemplo:

Assumindo distância euclidiana de 25, quaisquer cores que distarem menos que 25 são consideradas a mesma cor, então de um determinado ponto deste cubo, uma circunferência de raio 25 determina qual as cores que são consideradas iguais. Se o ponto considerado for uma cor pura, a análise é feita em um vértice do cubo.

Implementar a distância euclidiana é simples... d(p1, p2) = sqrt{[p1(x) - p2(x)]^2 + [p1(y) - p2(y)]^2 + [p1(z) - p2(z)]^2}

Mais informações:




João Felipe Silva Ouriques a.k.a. Phil
about.me/joaofelipeouriques

Mestrando em Ciência da Computação pela COPIN/UFCG
Bacharel em Ciência da Computação pela UFCG (2009)
Licenciado em Matemática pela UEPB (2006)
Pesquisador do SPLab (Software Practice Lab)

Reply all
Reply to author
Forward
0 new messages