2009-12-15 25 views
6

No estoy seguro de por dónde empezar con esto, así que sería bueno que nos guiaran. Lo que necesito lograr es examinar una imagen grande (digamos 1280x1024) y verificar si existe otra imagen más pequeña dentro o no (tal vez una imagen de 50x50 píxeles).C# Comprobación de si existe una imagen dentro de otra imagen

Intenté hacer esto comparando cada píxel que es realmente lento y puede que necesite hacerlo más de 100 veces para que no parezca adecuado. Me pregunto si hay una mejor manera.

Gracias

+0

Cómo exacta Por qué tiene que ser? ¿Podría cambiar el tamaño de las imágenes a la mitad del tamaño y comparar? – jestro

+0

¿Puede decirnos algo sobre el contenido de las imágenes? ¿Son mapas de bits estáticos al azar, o hay alguna estructura que pueda aprovechar? Además, ¿puede decirnos cuál es la probabilidad de que la consulta sea "basura"? Es decir, ¿cuál es la probabilidad de que la imagen pequeña NO se encuentre en la imagen grande? Si la consulta tiene una alta probabilidad de ser basura, entonces lo que desea optimizar es determinar rápidamente el estado de basura. ¿Cuáles son las consecuencias de equivocar la respuesta, ya sea falso positivo o falso negativo? ¿Tiene que ser exacto para todas las imágenes? –

+0

Ah, y ¿tiene que determinar * dónde * coincide la coincidencia, o simplemente si existe o no una coincidencia? –

Respuesta

3

sólo estaba trabajando en algo similar y el resultado rápido y sucio que se me ocurrió es utilizar la aplicación de "ExhaustiveTemplateMatching" de AForge.Net con imágenes de 1/4 de su tamaño. Las imágenes de 720p a tamaño completo tardaron un par de minutos, pero con un tamaño de 1/4 es aproximadamente un segundo en mi pequeña computadora.

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; 
    } 
} 

Se podría también, por supuesto, sólo comprueban tm.length> 0 y sí hay algunas divisiones innecesarias en allí: P

+0

Muchas gracias :) de la prueba rápida que hice que parece ideal, la probaré correctamente mañana – Tset

Cuestiones relacionadas