Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C#] Differenze tra due immagini
Forum - C# / VB.NET - [C#] Differenze tra due immagini

Avatar
francescobigozzi (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/01/2010

Segnala al moderatore
Postato alle 18:50
Lunedì, 10/10/2011
Questo topic è stato chiuso dal moderatore

Ho scritto questo codice per rilevare differenze tra due immagini ma è veramente lento. Come posso migliorarlo?

Codice sorgente - presumibilmente C# / VB.NET

  1. Bitmap image1 = (Bitmap)pct1.Image; //La prima immagine
  2.             Bitmap image2 = (Bitmap)pct2.Image; //La seconda immagine
  3.             Bitmap image3 = image2; //L'immagine che contiene le differenze
  4.             int value = trackBar.Value; //Teoricamente a 0, ma per avere solo differenze sostanziali a 10.
  5.             for (int i = 0; i < image1.Size.Width; i++)
  6.             {
  7.                 for (int j = 0; j < image1.Size.Height; j++)
  8.                 {
  9.                     Color c1 = image1.GetPixel(i, j);
  10.                     Color c2 = image2.GetPixel(i, j);
  11.                     if (Math.Abs(c1.R - c2.R) < value && Math.Abs(c1.G - c2.G) < value && Math.Abs(c1.B - c2.B) < value)
  12.                     {
  13.                         image3.SetPixel(i, j, Color.Transparent); //Mette il colore trasparente dove non ci sono differenze.
  14.                     }
  15.                 }
  16.             }



asd
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
2
Down
V
Segnala al moderatore
Postato alle 20:00
Lunedì, 10/10/2011
E' lento per colpa di GetPixel e SetPixel, infatti ogni volta questi richiamano Bitmap.LockBits e Bitmap.UnlockBits per il singolo pixel rallentando di molto l'operazione :yup:

La via più veloce è tramite codice unsafe, ma potrebbe essere interessante anche sfruttare il Marshalling per avere un'eventuale gestione di eccezioni (e qualsiasi altro motivo per cui il CLR ti è necessario) senza compromettere di molto le prestazioni.

Puoi trovare un articolo di due pagine abbastanza chiaro, in inglese e con relativi codici esempio a questi indirizzi:
http://davidthomasbernal.com/blog/2008/03/13/c-image-proce ...
http://davidthomasbernal.com/blog/2008/03/14/c-image-proce ...

Ultima modifica effettuata da il 10/10/2011 alle 20:13
Grazie mille! - francescobigozzi - 10/10/11 22:06
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6110
Iscritto: 04/12/2003

Up
1
Down
V
Segnala al moderatore
Postato alle 0:04
Martedì, 11/10/2011
Non reinventare la ruota; usa AForge.

http://code.google.com/p/aforge/


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM