AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Vergleichen zweier BitMaps
Thema durchsuchen
Ansicht
Themen-Optionen

Vergleichen zweier BitMaps

Ein Thema von fresh_hotboy · begonnen am 12. Nov 2003 · letzter Beitrag vom 13. Nov 2003
Antwort Antwort
fresh_hotboy

Registriert seit: 16. Okt 2003
6 Beiträge
 
#1

Vergleichen zweier BitMaps

  Alt 12. Nov 2003, 17:15
hi hallo

das forum hier ist echt erste sahne. habe ein paar lösungen für mein erstes problem bekommen und diese gleich umgesetzt. EIN FETTER DANK AN DIE ORGANISATOREN DIESES FORUMS!!!
nu habe ich ein weiteres problem, möchte zwei bitmaps miteinander vergleichen. das ergebnis anschliessend in eine neue paintbox laden.
kann mir da irgendeiner weiter helfen.

danke!!!!
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Vergleichen zweier BitMaps

  Alt 12. Nov 2003, 17:18
Was soll dennn bei Deinem Vergleich herauskommen? Ganz allgemein kann so ein Vergleich ja nur "sind identisch" oder "sind nicht identisch" liefern. Für so ein Resultat brauchst Du aber keine Paintbox.
Was hast Du also im Speziellen vor ?


P.S.: Heißen Dank für's fett Lob. *g*
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#3

Re: Vergleichen zweier BitMaps

  Alt 12. Nov 2003, 17:23
Wenn ich Dich richtig verstehe, willst Du die "Differenz" zweier Bilder berechnen, oder?
Aus den Lösungen zu Deinem letzen Posting weißt Du schon, wie Du die einzelnen Pixel auslesen kannst. Um nun die Differenz der Bilder zu berechnen, brauchst Du nur folgendes zu machen (vorausgesetzt, die Bildgrößen sind passend):
Delphi-Quellcode:
für jeden Pixel do
begin
  Ergebnispixel:= Pixel aus Bild1 - Pixel aus Bild2
end;
Bei der Berechnung kann es zu Überläufen kommen, wenn ein Farbwert aus Bild2 größer ist als der korrespondierende aus Bild1.

Willst Du lediglich die Pixel weiß zeichnen, in denen sich zwei Bilder unterscheiden, und alle anderen schwarz, probiere folgendes:
Delphi-Quellcode:
für jeden Pixel do
begin
  if Pixel aus Bild1 <> Pixel aus Bild2 then
    Ergebnispixel:= Weiß
  else
    Ergebnispixel:= Schwarz
[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]
gruß, choose
  Mit Zitat antworten Zitat
fresh_hotboy

Registriert seit: 16. Okt 2003
6 Beiträge
 
#4

Re: Vergleichen zweier BitMaps

  Alt 12. Nov 2003, 17:41
danke für eure antworten, sollte mich aber vielleicht doch besser ausdrücken!!
bin grad ein delphi anfänger und probiere so einiges aus. deshalb benötige ich wohl momentan eine etwas genauere anleitung zu den programmen. aber zurück zum thema:

habe zwei BitMaps in zwei Paintboxen geladen, diese anschliessend in graustufen umgewandelt. nun möchte ich diese bilder auf deren inhalt vergleichen (d.h. ob z.B. ein neuer gegenstand auf dem bild ist). das vergleichen geschiecht durch abziehen der farbwerte bild1-bild2. das Vergleichs bild soll anschliessend in eine dritte PaintBox gemalt werden.

so nu ist es hoffe ich einiegermassen klarer.

PS.: der lob ist berechtigt !!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Vergleichen zweier BitMaps

  Alt 12. Nov 2003, 17:57
Versuch es mal hiermit:
Delphi-Quellcode:
Var X, Y: Integer;

Begin
  For X := 0 to PaintBox1.Width - 1 do
    For Y := 0 to PaintBox1.Width - 1 do
      PaintBox3.Canvas.Pixels[X, Y] := (PaintBox1.Canvas.Pixels[X, Y] xor PaintBox2.Canvas.Pixels[X, Y]) and $00FFFFFF;
End;
Hab das mal schnell im Kopf optimiert. Also nicht getestet.
Das berechnet pro Pixel für jede Grundfarbe (Rot/Grün/Blau) die Farbdifferenz.
Rot3 := ABS(Rot1 - Rot2); Man könnte das Ganze noch auf ScanLine abändern, um die Berechnung zu beschleunigen.
$2B or not $2B
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Vergleichen zweier BitMaps

  Alt 12. Nov 2003, 19:19
Zitat von himitsu:
Delphi-Quellcode:
//gekürzt und geändert
Rot3 := (Rot1 xor Rot2) and $FF;
Hab das mal schnell im Kopf optimiert. Also nicht getestet.
Das berechnet pro Pixel für jede Grundfarbe (Rot/Grün/Blau) die Farbdifferenz.
Rot3 := ABS(Rot1 - Rot2);
Hi himitsu, bei mir ist aber obdA
($08 xor $01) <> abs($08 - $01) // $09 <> $07 Oder habe ich einen Denkfehler?
gruß, choose
  Mit Zitat antworten Zitat
fresh_hotboy

Registriert seit: 16. Okt 2003
6 Beiträge
 
#7

Re: Vergleichen zweier BitMaps

  Alt 12. Nov 2003, 19:32
hi hallo
VIELEN DANK !!
habe es bereits auf ein graustufenbild angewandt und es funktioniert .
bin gerade es mit dem befehl scanline zu optimieren, komme aber grad nicht auf den grünen punkt, da ich damit noch nicht so wirklich viel zu tun hatte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Vergleichen zweier BitMaps

  Alt 12. Nov 2003, 19:41
Ne, ich glaub der Denkfehler liegt bei mir. Funktioniert aber dennoch.

Kannst ja auch so rechnen:

Delphi-Quellcode:
Var R1, G1, B1, R2, G2, B2, Re, Ge, Be: Byte;

{je Pixel}
R1 := Bild1.Canvas.Pixels[X, Y] and $0000FF;
G1 := (Bild1.Canvas.Pixels[X, Y] and $00FF00) shr 8;
B1 := (Bild1.Canvas.Pixels[X, Y] and $FF0000) shr 16;

R2 := Bild2.Canvas.Pixels[X, Y] and $0000FF;
G2 := (Bild2.Canvas.Pixels[X, Y] and $00FF00) shr 8;
B2 := (Bild2.Canvas.Pixels[X, Y] and $FF0000) shr 16;

Re := Ord(R1 - R2);
Ge := Ord(G1 - G2);
Be := Ord(B1 - B2);

Bild3.Canvas.Pixels[X, Y] := RGB(Re, Ge, Be);
Auch wenn es nicht ganz richtig ist, ist es doch etwas schneller:
Bild3.Canvas.Pixels[X, Y] := (Bild1.Canvas.Pixels[X, Y] xor Bild2.Canvas.Pixels[X, Y]) and $00FFFFFF;
$2B or not $2B
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#9

Re: Vergleichen zweier BitMaps

  Alt 12. Nov 2003, 20:29
Zitat von himitsu:
Re := Ord(R1 - R2);
Hi himitsu,

hier gibt es Überlaufprobleme, wenn R2>R1, Du meinstest aber sicher, abs statt ord, oder?

Ich verstehe trotzdem nicht Deine Variante, nach der Du mithilfe zweier binärer Operationen eine Arithmetische ersetzt...? Wenn Du zB 128 xor 127 rechnest, ist das doch 255 statt 128 - 127 mit dem gewünschten Ergebnis 1. Sicher ist es schneller, aber das Ergebnis stimmt nicht ganz
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Vergleichen zweier BitMaps

  Alt 13. Nov 2003, 21:34
Stimmt, meinte natürlich ABS.
Das mit dem XOR, weis auch nicht was da in meinem Kopf fehlgeleitet wurde. (hatte mir auch ein paar Werte durchgerechnet, und da stimmte es fast)


Na dann optimieren wir mal in Richtung Graustufen.
Delphi-Quellcode:
Var R1, G1, B1, R2, G2, B2, Re, Ge, Be: Byte;

{je Pixel}
R1 := Bild1.Canvas.Pixels[X, Y] and $0000FF;
G1 := (Bild1.Canvas.Pixels[X, Y] and $00FF00) shr 8;
B1 := (Bild1.Canvas.Pixels[X, Y] and $FF0000) shr 16;

R2 := Bild2.Canvas.Pixels[X, Y] and $0000FF;
G2 := (Bild2.Canvas.Pixels[X, Y] and $00FF00) shr 8;
B2 := (Bild2.Canvas.Pixels[X, Y] and $FF0000) shr 16;

Re := ABS(R1 - R2);
Ge := ABS(G1 - G2);
Be := ABS(B1 - B2);

Bild3.Canvas.Pixels[X, Y] := RGB(Re, Ge, Be);
wird zu:
Delphi-Quellcode:
Var C: Byte;

{je Pixel}
C := ABS((Bild1.Canvas.Pixels[X, Y] and $0000FF) - (Bild2.Canvas.Pixels[X, Y] and $0000FF));
Bild3.Canvas.Pixels[X, Y] := RGB(C, C, C);
oder:
Delphi-Quellcode:
Var C: Byte;

{je Pixel}
C := ABS((Bild1.Canvas.Pixels[X, Y] and $0000FF) - (Bild2.Canvas.Pixels[X, Y] and $0000FF));
Bild3.Canvas.Pixels[X, Y] := (C shl 16) or (C shl 8) or C;
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:45 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