Vergleichsoftware für Bilder gesucht

Hallo,
habe über google und boardsuche leider nichts finden können was mir wirklich weitergeholfen hätte.

Ich suche nach einem Programm (sollte billig oder freeware sein) welches es ermöglicht zwei Bilder miteinander zu vergleichen (soweit ja noch ganz einfach) und mir danach die fehler anzuzeigen. ähnlich dem beliebten suchspielen in zeitschriften "finden sie die 10 fehler".

Hoffe ich habe mich so ausgedrückt das ihr mich verstanden habt!?

Christian
 
Hallo,
wäre doch mal ne Aufgabe, dies selber zu schreiben. Man bräuchte eine Programm, welches die Pixel von Bild 1 und Bild 2 einliest.

Dann in einer Schleife durchläuft es die Pixel, und wenn die Pixel unterschiedlich sind (andere Farbe), so makiert es das Pixel z.B. Rot.

Am Ende hat man dann ein Bild, bei dem alle verschiedenen Pixel rot sind, und die gleichen Pixeln werden so belassen.

Man hat nur Probleme, wenn sich dort irgendwie 1 Pixel verschiebt oder ähnliches.
 
an der idee gibt es leider nur zwei haken,

1) habe ich nicht die programmierfähigkeiten soetwas zu realisieren (ich scheiter ja schon an einem einfachen verschlüsselungsprogramm)

2) brauchen wir das in der arbeit und mein chef hat gemeint ich muss bis mittwoch was gefunden haben.

deswegen frage ich ja zusätzlich zu meiner andauernden suche (inzwischen über vier stunden) euch, vielleicht hat ja zufällig soetwas. bzw. weis was

Auch über tips hinweise etc. wäre ich erfreut ^^

Gruß

Christian
 
hab mal ein kleines java programm geschrieben. dies könntest du deinen bedürfnissen entsprechend anpassen, wenn du ein wenig ahnung von java hast.

Code:
import java.awt.image.BufferedImage;
import java.io.File;
import java.awt.Color;
import javax.imageio.ImageIO;

public class Bildvergleich {

	static void bilderVergleichen() throws Exception {
		int rotRGB = Color.RED.getRGB();
		int weissRGB = Color.WHITE.getRGB();
		int pixel1;   
		int pixel2;
			
		// bilder einlesen
		BufferedImage bild1 = ImageIO.read(new File("bild1.jpg"));
		BufferedImage bild2 = ImageIO.read(new File("bild2.jpg"));
				
		int breite1 = bild1.getWidth(null);
		int hoehe1 = bild1.getHeight(null);
		
		int breite2 = bild2.getWidth(null);
		int hoehe2 = bild2.getHeight(null);
		
		// wenn bilder unterschiedlich gross -> beenden
		if( (breite1 != breite2) || (hoehe1 != hoehe2) )
			throw new Exception("Bilder unterschiedlich gross.");
		
		// alle pixel vergleichen
		for (int j = 0 ; j < hoehe1; j++)
	    {
	    	for (int i = 0; i < breite1; i++)
	    	{
	    		pixel1 = bild1.getRGB(i, j);   
	    		pixel2 = bild2.getRGB(i, j);
	    		
	    		// wenn farbe des pixels nicht gleich -> durch rot ersetzen
	    		if(pixel1 != pixel2) 
	    			bild2.setRGB(i, j, rotRGB);
	    		//else // rest weiss setzen
	    		//	bild2.setRGB(i, j, weissRGB);
	    		
	    	}
	    }
		
		// bild mit unterschieden speichern als "difBild.jpg"
		File difBild = new File("difBild.jpg");
		ImageIO.write(bild2,"jpg",difBild);
	}
	
	public static void main(String[] args) {
		try {
			Bildvergleich.bilderVergleichen();
		}
		catch(Exception e) {
			System.err.println(e);
		}
	}

}
screenshot und binary zum testen im anhang.
 
@ivegot danke das du des geschrieben hast, aber leider funktioniert das net so gut wie erwünscht, wenn ich ein bild nehme, es mit paint öffne und nur unter einem anderen dateiname speichere, zeigt er mir fast das komplette bild rot an. ???

mache ich was falsch?

Christian

P.S.:Sorry das ich mich jetzt net näher mit dem source code beschäftige, aber ich kenne mich in der sprache überhaupt nicht aus, und bis ich mich einarbeite und das verstehen würde hat das neue jahr angefangen :(

edit: vielleicht ne idee nach was ich an begriffen googeln könnte? vielleicht habt ihr ja zufällig ein schlagwort welches ich noch nicht benutzt habe.

Bin langsam echt am verzweifeln, so lange habe ich noch nie nach was suchen müssen :(
 
Hi, ich hab leider nicht viel Zeit deshalb hab ich nicht alles gelesen/ausprobiert aber vielleicht ist ja etwas für dich dabei:

http://ihome.cuhk.edu.hk/~b400559/arraysoft_image.html
http://www.apple.com/aperture/compare/
http://www.mathworks.com/access/helpdesk/help/toolbox/images/index.html?/access/helpdesk/help/toolbox/images/f17-66533.html

@ ivegotmail : hab mir deinen Code zwar nicht angeschaut, aber ich wollte mal fragen ob du eine Toleranz eingebaut hast, d.h. dass nicht zwischen Erdbeerrot und Rosenrot unterschieden wird, bzw. dass in einem gewissen Radius gesucht wird.
 
Original von Cyberm@ster
@ ivegotmail : hab mir deinen Code zwar nicht angeschaut, aber ich wollte mal fragen ob du eine Toleranz eingebaut hast, d.h. dass nicht zwischen Erdbeerrot und Rosenrot unterschieden wird, bzw. dass in einem gewissen Radius gesucht wird.
nein hatte ich nicht, aber es jetzt mal getan. das ergebnis ist nun wesentlich besser.


Code:
import java.awt.image.BufferedImage;
import java.io.File;
import java.awt.Color;
import javax.imageio.ImageIO;

public class Bildvergleich {

	static void bilderVergleichen() throws Exception {
		int rotRGB = Color.RED.getRGB();
		int weissRGB = Color.WHITE.getRGB();
		int pixel1;   
		int pixel2;
		int toleranz = 180000;
			
		// bilder einlesen
		BufferedImage bild1 = ImageIO.read(new File("bild1.jpg"));
		BufferedImage bild2 = ImageIO.read(new File("bild2.jpg"));
				
		int breite1 = bild1.getWidth(null);
		int hoehe1 = bild1.getHeight(null);
		
		int breite2 = bild2.getWidth(null);
		int hoehe2 = bild2.getHeight(null);
		
		// wenn bilder unterschiedlich gross -> beenden
		if( (breite1 != breite2) || (hoehe1 != hoehe2) )
			throw new Exception("Bilder unterschiedlich gross.");
		
		// alle pixel vergleichen
		for (int j = 0 ; j < hoehe1; j++)
	    {
	    	for (int i = 0; i < breite1; i++)
	    	{
	    		pixel1 = bild1.getRGB(i, j);   
	    		pixel2 = bild2.getRGB(i, j);
	    		
	    		// wenn farbe des pixels nicht gleich -> durch rot ersetzen
	    		if( (pixel1 < (pixel2 - toleranz)) || (pixel1 > (pixel2 + toleranz))  ) 
	    			bild2.setRGB(i, j, rotRGB);
	    		//else // rest weiss setzen
	    		//	bild2.setRGB(i, j, weissRGB);
	    		
	    	}
	    }
		
		// bild mit unterschieden speichern als "difBild.jpg"
		File difBild = new File("difBild.jpg");
		ImageIO.write(bild2,"jpg",difBild);
	}
	
	public static void main(String[] args) {
		try {
			Bildvergleich.bilderVergleichen();
		}
		catch(Exception e) {
			System.err.println(e);
		}
	}

}
neuer screenshot und neues binary im anhang.
 
die Neuer Version ist schon fast ausreichend, ich würde nur gerne noch ein wenig mit den Toleranzwerten rumspielen, kann mir da bitte jemand sagen was ich wie öffnen muss damit ich das machen kann? ich finde leider auf die schnelle nicht und da heute schon mittwoch ist habe ich auch nicht wirklich viel zeit zum suchen :(

christian

P.S.: Übrigens danke ivegotmail
 
ich kann zwar kein java aber ich denke es mir wiefolgt:
in zeile 13 wird die toleranz definiert und zeile 38 kommt diese zum einsatz.
ich denke mal einfach den wert in zeile 13 jenachdem groesser oder kleiner machen und du hast was du willst ;)
 
soweit so gut, wenn ich jetzt noch weis wie ich an diese zeile rankomme wäre alles perfekt, denn so offensichtilch wie hier im thread find ich diese stelle im qt nicht :(
 
naja.. ivegotmail hat doch in seinem letzten post den quellcode geposted (siehe spoiler tag), dort aenderst du den wert und kompilierst und interpretierst das ganze neu.
aber wie gesagt ich kenn mich mit java nicht aus, koennte auch sein dass ich grade unglaublichen stuss erzaehl hrhr
 
danke, würdest du weiter oben lesen dann wüstest du das ich mich mit java überhaupt nichit auskenne UND das ich keine Zeit habe.... trotzdem danke!
 
ok da du scheinbar wirklich absolut keine ahnung hast wie man mit java umgeht, habe ich das prog nochmal umgeschreiben, so dass du den toleranzwert als parameter übergeben kannst (aber nicht musst, default wert ist 180000).

Code:
$ java -jar bildvergleich.jar
$ java -jar bildvergleich.jar 1000
$ java -jar bildvergleich.jar 221000
 
ähm, ich glaube jetzt blamiere ich mich komplett (wenn noch nicht geschehen) aber WO kann ich denn default wert eingeben? Finde das irgendwie nicht

greetz

christian
 
Default heisst standard und das ist der Wert den das Programm verwendet wenn du NICHTS eingibst

Wenn du also

Code:
$ java -jar bildvergleich.jar

eingibst arbeitet das Programm mit dem default-Wert
 
Man kann aber auch unterschiede in Bildern verstecken, ohne dass dadurch die Pixel beeinflusst werden. Wird zur Verschlüsselung von Informationen gerne verwendet (indem man quasi ein Orginalbild hernimmt und dann ein zweites danebenstellt, und der Unterschied zwischen beiden Bildern beinhaltet dann die Information), ein sehr nerviger Vorgang, da ich bis heute noch net ganz gecheckt hab wie ich durch händisches XORen an gewünschte Information rankomme *narf*

Nur so als Input^^
 
bin so doof, ich habe es halt immer mit nem doppelklick über den desktop aufgerufen, aber über console kann ich ja werte geben danke @all die geholfen haben

greetz

christian
 
Zurück
Oben