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();
}
}
Similaridade entre imagens
8 Respostas
É mais fácil comparar pixel a pixel e somar quando forem diferentes.
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;
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
Leia também:
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í…
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.
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?
Se você conhece as imagens previamente, pode usar template matching.
Ou seja, ter duas imagens de referência e comparar a similaridade com elas.