Gå til innhold

C#: Hvordan få C# til å scanne et bilde etter pixler?


Anbefalte innlegg

Jeg har et bilde som jeg skal scanne for pixler, jeg har søkt ganske mye nå, men jeg finner ingenting, kan noen hjelpe?

 

Jeg vil scanne bildet etter farge på pixelen, altså jeg sier hva slags farge som skal scannes etter, og jeg får melding om hvilke pixler som har en fargen.

Lenke til kommentar
Videoannonse
Annonse
Jeg har et bilde som jeg skal scanne for pixler, jeg har søkt ganske mye nå, men jeg finner ingenting, kan noen hjelpe?

 

Jeg vil scanne bildet etter farge på pixelen, altså jeg sier hva slags farge som skal scannes etter, og jeg får melding om hvilke pixler som har en fargen.

 

Akkurat som find() i Matlab altså?

 

Er det gråtone eller RGB-bilder?

 

Jeg har lagt ved litt kode som gjør et bilde om fra farge til gråtone, som blir lagret i et int-array. Det er mye raskere å jobbe med enn GetPixel(). Kan sikkert lett fikses slik at den returnere en 3D array istedenfor en 2D-array.

 

Det kan gjøre er å søke gjennom hele bildet piksel for piksel, ved hjelp av to for-løkker og så bruke GetPixel(x,y) på bildet. Så sammenligner du det du får ut av getpixel med det du leter etter, og hvis det er samme farge, lagrer du x og y i en Liste eller noe.

 

Dette vil gå ganske langsomt, fordi getpixel låser og låser opp hver eneste pixel. Derfor er det raskere å låse hele bildet, lese det ut til en array eller tre, og så låse bildet opp igjen. Så kan man gjøre all slags bildebehandling på arrayene. Søk litt rundt på BitmapData, så vil du sikkert finne opprinnelsen til koden under.

 

private double[,] image2array(Bitmap bi)
       {
           Size s = bi.Size;
           double[,] arr = new double[s.Width, s.Height];

           //MessageBox.Show(bi.PixelFormat.ToString());

           BitmapData bitmapData1 = bi.LockBits(new Rectangle(0, 0,
                                    bi.Width, bi.Height),
                                    ImageLockMode.ReadOnly,
                                    bi.PixelFormat);
           int a = 0;
           unsafe
           {
               byte* imagePointer1 = (byte*)bitmapData1.Scan0;

               for (int i = 0; i < bitmapData1.Height; i++)
               {
                   for (int j = 0; j < bitmapData1.Width; j++)
                   {
                       // convert RGB to GREY-Scale 
                       a = (imagePointer1[0] + imagePointer1[1] +
                            imagePointer1[2]) / 3;
                       arr[j, i] = a;
                       //4 bytes per pixel
                       imagePointer1 += 3;
                   }//end for j
                   //4 bytes per pixel
                   imagePointer1 += bitmapData1.Stride -
                                   (bitmapData1.Width * 3);
               }//end for i
           }//end unsafe

           bi.UnlockBits(bitmapData1);


           return arr;

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...