Similaridade entre imagens

8 respostas
Z
olá, eu tenho comigo um código que compara duas imagens e diz se são ou não iguais, ele faz isso através do método PixelGrabber que utiliza matrizes para isso, mas eu gostaria de saber se existe um modo de retornar a porcentagem de similaridade das duas imagens, isso é possível? como?(desculpem sou novo com o java) segue o código:
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.PixelGrabber;
 
public class Compare {
 
static void processImage() {
 
String file1 = "pic1.png";
String file2 = "pic2.png";
 
Image image1 = Toolkit.getDefaultToolkit().getImage(file1);
Image image2 = Toolkit.getDefaultToolkit().getImage(file2);
 
try {
 
PixelGrabber grab1 =new PixelGrabber(image1, 0, 0, -1, -1, false);
PixelGrabber grab2 =new PixelGrabber(image2, 0, 0, -1, -1, false);
 
int[] data1 = null;
 
if (grab1.grabPixels()) {
int width = grab1.getWidth();
int height = grab1.getHeight();
data1 = new int[width * height];
data1 = (int[]) grab1.getPixels();
}
 
int[] data2 = null;
 
if (grab2.grabPixels()) {
int width = grab2.getWidth();
int height = grab2.getHeight();
data2 = new int[width * height];
data2 = (int[]) grab2.getPixels();
}
 
System.out.println("Pixels equal: " + java.util.Arrays.equals(data1, data2));
 
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
 
public static void main(String args[]) {
processImage();
}
}

8 Respostas

V

É mais fácil comparar pixel a pixel e somar quando forem diferentes.

V

Considerando que as imagens de entrada tem o mesmo tamanho e estão alinhadas, seria uma questão de fazer assim:

int difference = 0; for (int i = 0; i < data1.length; i++) { if (data1[i] != data2[i]) { difference++; } } double percent = difference / (double)data1.length;

Z

Vinigodoy
desculpa, é a primeira vez que trabalho com imagens no java(e já vou pruma dessas kk) e realmente não sei como fazer isso, ja pesquisei sobre OCR, e tudo, mas ainda não achei o que quero, então se tiver um exemplo de como fazer isso eu agradeço =)
//
não tinha visto o segundo post kkk, vou testar aqui, vlw

V

Leia também:

Z

problema seria, se eu usasse duas fotos iguais, mas uma versão um pouco mais escura que a outra, a porcentagem já seria nula, não é?

outra coisa, quando coloco duas imagens iguais ele retorna 0 de similaridade, dai eu troquei e coloquei 1-percent, mas ai pra duas imagens que só tinham um relogio de diferença só tinha 16% igual, tem algo errado aí…

V

O calculo que eu coloquei ali, como o nome da variável indica, calcula o percentual de diferença.
A similaridade é 100% - aquele valor.

double similarity = 1.0 - percent;

Se você quiser comparar similares imagens com tom de luz diferente, desprezando esse fato, terá que converte-las para HSB e colocar uma tolerância no canal de brightness.

Z

e se eu tivesse que reconhecer um tipo de padrão?
por exeplo:
imagem a-> tela branca com smile preto
imagem b -> tela preta com smile braco
o smile é o mesmo, um unico padrão como q faria para reconhecer?

V

Se você conhece as imagens previamente, pode usar template matching.
Ou seja, ter duas imagens de referência e comparar a similaridade com elas.

Criado 6 de abril de 2013
Ultima resposta 7 de abr. de 2013
Respostas 8
Participantes 2