2009-12-15 11 views
6

Ich bin mir nicht sicher, wo ich anfangen soll, damit eine Anleitung gut wäre. Was ich erreichen muss, ist, ein großes Bild zu untersuchen (sagen wir 1280x1024) und zu überprüfen, ob ein anderes kleineres Bild darin existiert oder nicht (vielleicht ein 50x50 Pixel Bild).C# Überprüfen, ob ein Bild in einem anderen Bild vorhanden ist

Ich habe versucht, dies zu tun, indem Sie jedes Pixel, das wirklich langsam ist, vergleichen und ich muss es vielleicht mehr als 100 Mal tun, damit es nicht geeignet erscheint. Ich frage mich nur, ob es einen besseren Weg gibt?

Dank

+0

Wie genau funktioniert es sein? Könnten Sie die Größe der Bilder auf die Hälfte reduzieren und vergleichen? – jestro

+0

Können Sie uns etwas über den Inhalt der Bilder sagen? Sind das zufällige statische Bitmaps oder gibt es eine Struktur, die Sie nutzen könnten? Kannst du uns auch sagen, wie wahrscheinlich es ist, dass die Abfrage "Junk" ist? Das heißt, wie groß ist die Wahrscheinlichkeit, dass das kleine Bild NICHT im großen Bild gefunden wird? Wenn die Abfrage eine hohe Wahrscheinlichkeit hat, Junk zu sein, dann bestimmt das, worauf Sie optimieren wollen, schnell den Junk-Status. Was sind die Konsequenzen, wenn die Antwort falsch, falsch positiv oder falsch negativ ist? Muss es für alle Bilder genau sein? –

+0

Oh, und müssen Sie bestimmen, * wo * die Übereinstimmung ist, oder nur, ob eine Übereinstimmung existiert oder nicht? –

Antwort

3

Ich arbeite gerade an etwas ähnlichem und das schnelle und schmutziges Ergebnis kam ich mit ist AForge.Net Implementierung von „ExhaustiveTemplateMatching“ mit Bildern 1/4 ihrer Größe zu verwenden. 720p Bilder in voller Größe dauerte ein paar Minuten, aber bei 1/4 Größe ist es etwa eine Sekunde auf meinem kleinen Computer.

public static class BitmapExtensions 
{ 
    /// <summary> 
    /// See if bmp is contained in template with a small margin of error. 
    /// </summary> 
    /// <param name="template">The Bitmap that might contain.</param> 
    /// <param name="bmp">The Bitmap that might be contained in.</param>   
    /// <returns>You guess!</returns> 
    public static bool Contains(this Bitmap template, Bitmap bmp) 
    { 
     const Int32 divisor = 4; 
     const Int32 epsilon = 10; 

     ExhaustiveTemplateMatching etm = new ExhaustiveTemplateMatching(0.9f);      

     TemplateMatch[] tm = etm.ProcessImage(
      new ResizeNearestNeighbor(template.Width/divisor, template.Height/divisor).Apply(template), 
      new ResizeNearestNeighbor(bmp.Width/divisor, bmp.Height/divisor).Apply(bmp) 
      ); 

     if (tm.Length == 1) 
     { 
      Rectangle tempRect = tm[0].Rectangle; 

      if (Math.Abs(bmp.Width/divisor - tempRect.Width) < epsilon 
       && 
       Math.Abs(bmp.Height/divisor - tempRect.Height) < epsilon) 
      { 
       return true; 
      }     
     } 

     return false; 
    } 
} 

Sie könnten auch für tm.length überprüfen natürlich nur> 0 und ja, es gibt einige unnötige Spaltungen in dort: P

+0

Vielen Dank :) aus dem schnellen Test habe ich das scheint ideal, ich werde es morgen richtig testen – Tset

Verwandte Themen