identische Bilder mit Intel IPP finden

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    identische Bilder mit Intel IPP finden

    Hallo, liebe Profis!

    Ich habe versucht, mit meinen bescheidenen Möglichkeiten, einen Code zu basteln, der erkennen kann, ob 2 Bilder identisch sind oder nicht.

    Das klappt auch (siehe Code unten).

    Mein Ansatz ist aber nicht brauchbar, weil es für einen Vergleich von 2 Bitmaps ungefähr 5 Sekunden braucht und ich mit ungefähr 40.000 Bildern arbeiten muss.

    Ich bin gerade dabei Super8-Filme zu digitalisieren und programmiere sehr gerne kleine Tools, die mir die Arbeit leichter machen.

    Ich würde gerne ein Tool programmieren, das Bildhänger im Film finden kann - diese können beim Aufnehmen entstehen, wenn der Film hängt - (ich weiß, dass dies eine tolle Erklärung ist :) ).

    Dazu wäre aber ein gewisser Anteil an Unterstützung nötig, da ich zwar etwas programmieren kann, aber kein Profi bin (ist ein Hobby von mir).

    "picoflop" hatte im VB-Paradiese-Forum einen "BitmapComparer" erwähnt, mit einer "Performance" Lib: Framewave von AMD.

    Dazu hatte er auch ein Beispiel gepostet (Freitag, 8. Juli 2011, 08:20) - Zwei Bilder am schnellsten/besten Vergleichen?

    Für Intel soll man IPP (Intel Integrated Performance Primitives) nutzen.

    Leider würde ich einen BitmapComparer mit IPP brauchen, da mein PC Intel-Prozessoren hat (habe mir IPP heruntergeladen).

    Ich habe versucht Code-Beispiele für die Verwendung von IPP in Verbindung mit VB.Net zu finden - nur ist das mir leider nicht gelungen.

    Leider kann ich außer meinem (wahrscheinlich naiven) Ansatz nichts beitragen...

    Ich hätte bei meinem Ansatz nur die Idee, dass man (um Zeit zu sparen) nicht jeden Pixel vergleicht, sondern nur jeden 4ten? oder 8ten? - und dass man nicht jedes Bild vergleicht, sondern auch nur jedes 10te?
    So könnte man deutlich Zeit einsparen, aber auf Kosten der Zuverlässigkeit (ob identisch oder nicht).

    Ich möchte euch bitten, wenn es möglich wäre, mir da etwas "unter die Arme zu greifen".

    Ich würde gerne IPP mit VB.Net verwenden um Bildhänger zu finden.

    Wenn jemand so freundlich wäre und mir helfen könnte, wie man mit IPP 2 Bmp als identisch einstuft - dazu benötige ich etwas Hilfe.

    Ich tüftele natürlich im Rahmen meiner Möglichkeiten mit, aber meine Fähigkeiten/Erfahrung sind nicht so ausgeprägt, wie bei einem Profi.

    Es wäre toll, wenn jemand dazu die Lust und die Zeit hätte...

    Viele Grüße,

    kwon

    Hier mein bescheidener Versuch:

    Habe als Test 2 identische Bilder verglichen - diese werden als identisch eingestuft.
    Dann habe ich in einem der beiden identischen Bildern einen kleinen lila Punkt gesetzt
    (und so das Bild mit dem Punkt zu einem nicht identischen gemacht)
    - jetzt werden beide Bilder als NICHT identisch eingestuft.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim bild1 As New Bitmap("C:\ident_Bilder_finden\bild1.bmp"), bild2 As New Bitmap("C:\ident_Bilder_finden\bild2.bmp")
    4. Dim answer As Boolean = False
    5. answer = ident(bild1, bild2)
    6. If answer = True Then
    7. MessageBox.Show("identisch")
    8. Else
    9. MessageBox.Show("nicht identisch")
    10. End If
    11. End Sub
    12. Function ident(i1 As Image, i2 As Image) As Boolean
    13. Dim x As Integer, y As Integer
    14. Dim b1 As Bitmap = i1, b2 As Bitmap = i2, c As Color, d As Color
    15. For y = 0 To b2.Height - 1
    16. For x = 0 To b1.Width - 1
    17. c = b1.GetPixel(x, y)
    18. d = b2.GetPixel(x, y)
    19. If c.ToString <> d.ToString Then
    20. Return False
    21. End If
    22. Next
    23. Next
    24. Return True
    25. End Function
    26. End Class
    Mit Intel IPP kenne ich mich nicht aus, aber GetPixel ist nicht sehr schnell. LockBits ist deutlich schneller, versuch es mal damit. Mit diesen Code kann ich ein 190 MB Image(8K Auflöung, PNG von der NASA) in 3.3 Sekunden vergleichen, mit deinem Code dauert es über 1 Minute bei dem Bild . Aber es muss nicht immer der ganze Code ausgeführt werden, denn wenn die Bilder nicht gleich Groß sind, warum noch die Daten vergleichen, oder wenn unterschiedliche PixelFormate verwendet werden. Das könnte sogar deinen Code beschleunigen.

    Und schalte mal ganz flott auf Option Strict On um!

    VB.NET-Quellcode

    1. Private Function IsEqualBitmapData(bmp1 As Bitmap, bmp2 As Bitmap) As Boolean
    2. If bmp1.Size <> bmp2.Size Then Return False
    3. If bmp1.PixelFormat <> bmp2.PixelFormat Then Return False
    4. Dim r As New Rectangle(0, 0, bmp1.Width, bmp1.Height)
    5. Dim bmpData1 As BitmapData = bmp1.LockBits(r, ImageLockMode.ReadOnly, bmp1.PixelFormat)
    6. Dim bmpData2 As BitmapData = bmp2.LockBits(r, ImageLockMode.ReadOnly, bmp2.PixelFormat)
    7. Dim size1 As Integer = bmpData1.Stride * bmpData1.Height
    8. Dim size2 As Integer = bmpData2.Stride * bmpData2.Height
    9. If size1 <> size2 Then
    10. bmp1.UnlockBits(bmpData1)
    11. bmp2.UnlockBits(bmpData2)
    12. Return False
    13. End If
    14. Dim data1() As Byte = New Byte(size1) {}
    15. Dim data2() As Byte = New Byte(size2) {}
    16. Marshal.Copy(bmpData1.Scan0, data1, 0, size1)
    17. Marshal.Copy(bmpData2.Scan0, data2, 0, size2)
    18. bmp1.UnlockBits(bmpData1)
    19. bmp2.UnlockBits(bmpData2)
    20. Return data1.SequenceEqual(data2)
    21. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BitBrösel“ ()

    @kwon Berechne den System.Drawing Bitmap.GetHashCode() der Bilder. Sind sie verschieden, sind die Bilder verschieden.
    Sind sie gleich, musst Du weiter suchen.
    docs.microsoft.com/de-de/dotne…system-object-gethashcode
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ist das auch sicher? Also funktioniert das auch wenn die Bilder an sich gleich sind, aber nur Tags verschieden sind? Dachte auch erst dran einen Hash zu verwenden, dachte dann aber auch an mögliche unterschiedliche Tags, die einem reingrätschen könnten.(ich find Bitmap.GetHashCode nicht bei MS???)

    PS.

    habs gefunden, Object.GetHashCode, Bitmap hat ja Object inne.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „BitBrösel“ ()

    BitBrösel schrieb:

    Ist das auch sicher?
    Im Ernstfall muss man halt auf das Pixel-Array zugreifen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi

    Ein Bildvergleich ist immer etwas schwierig. Da spielen diverse Faktoren mit rein (mal die Metatagdaten außen vorgelassen). Eine Mögliche Idee wie man hier herangehen könnte, wird hier beschrieben: codeproject.com/Articles/37438…e-image-comparison-in-NET wobei man sich nun auch noch aussuchen kann ob man das mit .NET-Mitteln (GDI+) oder mit WIC realisiert.
    Mfg -Franky-