Analisar cor pixel a pixel de uma imagem?

6 respostas
A

Pessoal, será que existe alguma classe Java (mesmo que seja de terceiros (externa)) que verifique mudanças drásticas em imagens? Vou explicar melhor:

Queria desenvolver um aplicativo que comparasse imagens e que se as duas imagens comparadas fossem diferentes ele daria um sinal. Resolvi usar a classe Robot que já vem com o Java para analisar pixel a pixel (nela tem um método que verifica a cor do pixel). O problema é que esse método no Robot analisa o pixel do monitor e não de uma imagem, e como eu gostaria de analisar as imagens sem que o usuário precisa-se ver-las, não funcionaria. Caso alguém saiba como analisar o pixel de uma imagem, será que poderia me dizer?

Acredito que não exista mesmo, mas não custa tentar perguntar, já vi tanta coisa no Java que não duvido de mais nada :smiley:

Muito Obrigado

6 Respostas

A

alexcostars:
Pessoal, será que existe alguma classe Java (mesmo que seja de terceiros (externa)) que verifique mudanças drásticas em imagens? Vou explicar melhor:

Queria desenvolver um aplicativo que comparasse imagens e que se as duas imagens comparadas fossem diferentes ele daria um sinal. Resolvi usar a classe Robot que já vem com o Java para analisar pixel a pixel (nela tem um método que verifica a cor do pixel). O problema é que esse método no Robot analisa o pixel do monitor e não de uma imagem, e como eu gostaria de analisar as imagens sem que o usuário precisa-se ver-las, não funcionaria. Caso alguém saiba como analisar o pixel de uma imagem, será que poderia me dizer?

Acredito que não exista mesmo, mas não custa tentar perguntar, já vi tanta coisa no Java que não duvido de mais nada :smiley:

Muito Obrigado

Galera, como eu realmente não acredito que exista como, eu fiz pela classe Robot mesmo. Para que eu possa analisar eu preciso colocar a imagem na tela (eu coloco ela como um ícone de Label), o problema é que eu não sei em que posição X-Y da tela o componente está. Será que existe alguma maneira que eu possa descobrir em qual X e Y (em pixels) os componentes de meu jFrame começam?

vlw

T

Você pode pegar ambas as imagens e efetuar uma operação aritmética sobre elas (tipicamente XOR). Se algo aparecer que for diferente de 0, então é um pixel diferente.

Rode o programa Java2Demo (que é um programa que está em <diretório do JDK>\demo\jfc\Java2D ) e veja o demo do tab Composite que se chama AC Rules. Há uma figura que é a XOR; quando você faz XOR de 2 figuras exatamente iguais, o resultado deve ser um bitmap preto. Se elas forem diferentes por um pixel (por exemplo), deve aparecer um pixel em uma cor diferente de preto.

Os fontes estão nesse mesmo diretório (Java2Demo.)

M

Voce tem que pegar o WritableRaster da Bufferedimage que quer analizar.

V

Usar Robot foi uma péssima idéia. O ideal é usar o Java2D para trabalhar com imagens, como o Mark falou, através da classe BufferedImage. Este tutorial explica como trabalhar com a classe:
http://java.sun.com/docs/books/tutorial/2d/images/index.html

E esses aqui falam mais sobre o uso de rasters, que permitem fazer o que você quer (analisar pixel-a-pixel):
http://javaboutique.internet.com/tutorials/rasters/
http://javaboutique.internet.com/tutorials/rasters2/

Agora, é sempre bom definir o que você entende por uma imagem “muito diferente” da outra. Pois, dependendo do que você queira analisar, esse pode ser um trabalho muito complexo ou muito simples.

K

Minha sugestão: use a classe PixelGrabber ou esta classe aqui que é ainda melhor para ter uma representação da imagem ou parte de imagem como um vetor de inteiros, onde cada elemento desse vetor de inteiros representa exatamente 1 pixel dessa imagem ou subimagem. A partir dessas representações acho que dá para ir comparando as coisas.

Inté.

A

Bah kra, gostei disso que vc falou, entrei lá e rodei certinho, até achei o “ícone” lá, o problema é que não descobri onde escolher as imagens para dar uma testada (se é que tem como). Será que vc podia me passar uns links sobre esse XOR porque pesquisei no Google mas a maioria era outro assunto, os poucos que encontrei apenas falavam para que servia, mas nenhum ensinava a usar “via código”.

Muito Obrigado!

Criado 16 de agosto de 2009
Ultima resposta 17 de ago. de 2009
Respostas 6
Participantes 5