Entwickler-Ecke
Multimedia / Grafik - Bildvergleich mit scanline bringt falsches Ergebnis
MadCyborg - Di 04.10.05 13:32
Titel: Bildvergleich mit scanline bringt falsches Ergebnis
ich habe zwei bitmaps, die ich gerne vergleichen möchte. zum testen habe ich mit zwei fast komplett identische mit paint(dem von windows) erstellt. sie haben einen einfarbigen hintergrund, eine linie, und einen kreis darauf. der unterschied ist lediglich ein einziger pixel, undzwar der ganz oben links. wenn ich mein programm unterschiedliche pixel suchen lasse, sagt es mir aber es gibt zwei. ich habe dann noch ein testbitmap gemacht, mit einer 61 pixel langen linie ( von (o;o) bis 0;60), wenn ich mein programm darauf anwende, kriege ich 122 als ergebnis. --> zweimal so viel.
hat einer ne idee dazu, oder mache ich grundlegend irgendwas falsch?
x1, y1 und unterschiede sind integer, c1 und c2 sind PByteArray.
sollte mehr code von nöten sein, stelle ich den garne dazu... wäre schön wenn mir einer helfen kann.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| for y1:=0 to image1.Height - 1 do begin c1:=image1.picture.Bitmap.scanline[y1]; c2:=image2.picture.Bitmap.scanline[y1];
for x1:=0 to image1.Width - 1 do begin if (c1[x1]<>c2[x1]) then begin
unterschiede:=unterschiede+1; end
end;end;lbl_unterschiede.caption:=inttostr(unterschiede); |
Lossy eX - Di 04.10.05 13:43
Haben deine Bilder 8 Bit Farbtiefe? Wenn nein (wovon ich mal ausgehe) wirst du mit einem pByteArray nicht weit kommen. Das Problem ist, dass du das Bild Byteweise und nicht Pixelweise untersuchst. Bei 24 Bit Bildern besitzt ein Pixel 3 Bytes. Blau, Grün und Rot. Bewusst so herum aufgezählt, weil sie so abgespeichert sind. Wenn du jetzt ein Pixel Rot anstelle von Grün hast, dann sind 2 Bytes unterschiedlich. Obwohl sie zu ein und dem selbe Pixel gehören. Bei 24 Bit musst du entsprechend 3 Bytes am Stück anstelle von einem Überprüfen. Bei 16 nur 2 Bytes. Bei 8 nur eines. Und bei 4 sogar nur jedes halbe Byte, da sich Pixel ein Byte teilen.
Abhelfen kannst du dies indem du das Pixelformat der Bitmaps auf pf24Bit stellst und dann immer 3 Bytes am Stück vergleichst. Du vergrößerst den Speicherverbrauch zwar zwischenzeitlich etwas aber so kannst du dir 20 verschieden Arten der Vergleiche ersparen.
Je nachdem was dir lieber ist kannst du das PixelFormat auch auf pf32Bit stellen. Dann sind 4 Bytes (Cardinal, DWord) genau ein Pixel. Das macht sich beim Vergleichen mitunter wesentlich einfacher. Und wahrscheinlich auch schneller.
MadCyborg - Di 04.10.05 13:55
gut. ich denke ich verstehe worauf du hinauswillst.
ich habe gerade mal die farbtiefe der bitmaps auf pf8bit festgelegt, und c1/c2 als PBytearray gelassen, so macht das programm exakt das was es soll.
ich werde mich dann mal daran machen, das es da auch mit der ursprüngliche farbtiefe tut.
thx schonmal für eine antwort.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!