AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bilder vergleichen

Ein Thema von SCHNICO · begonnen am 13. Mär 2004 · letzter Beitrag vom 6. Jun 2006
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
SCHNICO

Registriert seit: 22. Okt 2003
Ort: Zootzen
21 Beiträge
 
Delphi 6 Enterprise
 
#1

Bilder vergleichen

  Alt 13. Mär 2004, 09:01
hi all,

ich suche nach einer möglichkeit zwei bilder zu vergeleichen? Kann mir da jemand helfen?

Danke im voraus!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Bilder vergleichen

  Alt 13. Mär 2004, 09:03
Kommt drauf an. Wann sind denn für dich Bilder gleich? Wenn sie Pixel für Pixel übereinstimmen? dann hol die Mit ScanLine jedes Pixel und vergleiche.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Bilder vergleichen

  Alt 13. Mär 2004, 16:31
Gibt zwei Varianten.

1) Du vergleichst die Dateien binär - d.h. sie müssen absolut gleich sein, um als gleich zu gelten.

2) Pixel-by-Pixel vergleichen, oder beser noch von jedem Pixel jeweils r-, g- und b-Anteil vergleichen. Dort kann man dann 2 Arten von Toleranz einbauen. Einmal eine per-Channel-per-Pixel Toleranz, das heisst wenn ein Pixel in einem Bild etwas dunkler ist, aber der Farbwert sonst recht gut hinkommt, werden sie als gleich angesehen. (gut bei Vergleichen von bmp's mit jpeg's). Oder man prüft auf absolute Pixelgleichheit und zählt mit viel viele Pixel gleich sind. Bei z.B. 80% Gleichheit gelten die Bilder als gleich.
Jetzt könnte man das auch kombinieren: Es wird tolerant by-Channel (by-Farbkanal = r, g, b) verglichen, und wenn die toleranz überschritten ist werden die ungleichen mitgezählt. Dann noch Verfahren 2 anwenden, und bei 90% toleranter Pixel-Channel-Gleichheit sind die Bilder dann gleich.
Mit den Schwellenwerten muss man ein wenig expeimentieren um verlässliche Ergebnisse zu erhalten.


gruss,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von MathiasH
MathiasH

Registriert seit: 14. Jun 2002
Ort: Vachendorf (SO-Bayern)
41 Beiträge
 
Delphi 6 Professional
 
#4

Re: Bilder vergleichen

  Alt 15. Mär 2004, 15:53
harifg dürfte die Angelegenheit allerdings werden wenn dein code z.B. Ausschnitte oder verzerrungen auch zulassen soll. irgendwann hab ich ml ein bisschen sowas gebaut, das ging dann damit, dass er versucht hat formen zu erkennen (also formen >5% bildfläche). Das hab ich dann so gemacht, dass ich das bild erst sehr stark verwischt hab (besonders in Bezug auf einzelne pixel die stark heraustreten) Danach hab ich dann das bild abgetastetund versucht dreiecke reinzulegen. Haben diese dreiecke bei beiden bildern dann halbwegs übereingestimmt hat mein code gleich ausgegeben. war aber ein nettes Stück Arbeit...
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Bilder vergleichen

  Alt 15. Mär 2004, 16:02
Das ist dann ja schon fast Vektorisierung...

Habe bei meinem Vergleicher auch zunächst getestet, od das Seitenverhältnis der zwei Probanden in etwa hinkommt, und dann hab ich das größere auf die Größe des kleines skaliert, und DANN tolerant pixelweise getestet. Bei Gleichheit hab ich auch das kleinere dann direkt in einen "zu löschen"-Ordner gepackt, damit man vorm endgültigen Löschen noch mal besser gucken kann. Auch ein Delete-Log hab ich mitgeführt, so dass man nachsehen kann, welche Dateien/Bilder als gleich gelten, und welches der Beiden quasi-gelöscht ist. Wollte noch eine direkte Vergleichsmöglichkeit in mein Programm bauen, ist aber mangels Zeit und wegen eines grundsätzlichen Problems mit TJPGImage+Threads zum Erliegen gekommen...


gruss,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
SCHNICO

Registriert seit: 22. Okt 2003
Ort: Zootzen
21 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Bilder vergleichen

  Alt 18. Mär 2004, 18:05
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,w,r,x : integer ;
  BitMap, BitMap2 : TBitMap;
  P,P2 : PByteArray;
begin
 BitMap := TBitMap.create;
 BitMap2 := TBitMap.create;
 BitMap.LoadFromFile('vorlage.bmp'); //Laden der ausgangsdatei
 BitMap2.LoadFromFile('screenshot.bmp'); //Laden der vergleichsdatei
 r := 0;
 w := 0;
for i := 0 to BitMap.Height - 1 do
begin
 P := BitMap.ScanLine[i];
 P2 := BitMap2.ScanLine[i];
 if p = p2 then
  r := r + 1 //anzahl gleicher Lines
  else
  w := w + 1; //anzahl unterschiedlicher lines
end;
Label1.caption := InttoStr(r);
Label2.caption := IntToStr(w);
end;
Das war jetzt mein erster gehversuch mit ScanLine.
Aber selbst wenn ich zwei verschiedene Dateien (auflösung ist die selbe) nutze kommt immer das ergebnis bei raus das diese dateien an keiner stelle übereinstimmen. Kann mir da jemand etwas nachhelfen? Danke schon mal im voraus.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: Bilder vergleichen

  Alt 18. Mär 2004, 18:10
hi,

Vielleicht hilft dir ja dies:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  b1, b2: TBitmap;
  c1, c2: PByte;
  x, y, i,
  different: Integer; // Counter for different pixels
begin
  b1 := Image1.Picture.Bitmap;
  b2 := Image2.Picture.Bitmap;
  Assert(b1.PixelFormat = b2.PixelFormat); // they have to be equal
  different := 0;
  for y := 0 to b1.Height - 1 do
  begin
    c1 := b1.Scanline[y];
    c2 := b2.Scanline[y];
    for x := 0 to b1.Width - 1 do
      for i := 0 to BytesPerPixel - 1 do // 1, to 4, dep. on pixelformat
      begin
        Inc(different, Integer(c1^ <> c2^));
        Inc(c1);
        Inc(c2);
      end;
  end;
end;
(c) by SwissDelphiCenter
Thomas
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Bilder vergleichen

  Alt 18. Mär 2004, 18:19
Zitat von SCHNICO:
P := BitMap.ScanLine[i];
P2 := BitMap2.ScanLine[i];
if p = p2 then
r := r + 1 //anzahl gleicher Lines
else
w := w + 1; //anzahl unterschiedlicher lines
end;
Das kann so nicht funktionieren.
P & P2 sind lediglich 2 Zeiger, die natürlich bei 2 Bitmaps immer
verschieden sind.

Deshalb:
Delphi-Quellcode:
   for j:= 0 to BitMap.Width - 1 do
   if P[j] = P2[j] then
      Inc(r) //anzahl gleicher Pixel
   else
      Inc(w); //anzahl unterschiedlicher Pixel
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#9

Re: Bilder vergleichen

  Alt 18. Mär 2004, 18:26
p und p2 sind nur Zeiger auf die Array's (ScanLine's) und diese sind immer unterschiedlich, da die beiden Array's nie den selben Speicherplatz verwenden

Du muß also die Daten vergleichen - ich hoffe mal, dass es mit CompareMem geht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,w,r,x : integer ;
  BitMap, BitMap2 : TBitMap;
  P,P2 : PByteArray;
begin
 BitMap := TBitMap.create;
 BitMap2 := TBitMap.create;
 BitMap.LoadFromFile('vorlage.bmp'); //Laden der ausgangsdatei
 BitMap2.LoadFromFile('screenshot.bmp'); //Laden der vergleichsdatei
 r := 0;
 w := 0;
for i := 0 to BitMap.Height - 1 do
begin
 P := BitMap.ScanLine[i];
 P2 := BitMap2.ScanLine[i];
 if (Length(P) = Length(P2)) and CompareMem(P, P2, Length(P)) then
  r := r + 1 //anzahl gleicher Lines
  else
  w := w + 1; //anzahl unterschiedlicher lines
end;
Label1.caption := InttoStr(r);
Label2.caption := IntToStr(w);
end;
notfalls kann man's auch Byteweise vergleichen:
Delphi-Quellcode:
for i := 0 to BitMap.Height - 1 do
begin
 P := BitMap.ScanLine[i];
 P2 := BitMap2.ScanLine[i];
 B := Length(P) = Length(P2);
 if B then
  for i2 := 0 to Length(P) - 1 do
   if P[i2] <> P2[i2] then begin
    B := false;
    break;
   end;
 if B then
  r := r + 1 //anzahl gleicher Lines
  else
  w := w + 1; //anzahl unterschiedlicher lines
end;
(Angaben ohne Waffen)

[add]
ich sollte mal aufhören was nebenbei zu machen http://FNSE.de/15C.gif
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Ricane
Ricane

Registriert seit: 21. Mär 2003
Ort: Quickborn
170 Beiträge
 
Delphi 7 Architect
 
#10

Re: Bilder vergleichen

  Alt 8. Sep 2004, 20:34
Hi,

hab das eben gerade mal getestet..... leider funzt diese Zeile:

Length(P) Nicht....... imkompatible Typen..... ich überleg schon die ganzen Zeit, wie man das konvertieren könnte, bzw. wie man den die Länge sonst noch "bekommen" könnte.....


Weiss jemand mehr?!

Ricane
Hendrik
So much to Code... so less Time....

www.RicaneSoftware.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz