blaue pixel eines Images zählen [C#]

P

paul_meiz

Also wie schon im tittel erwähnt möchte ich blaue pixel in einem bild zählen,
das bild wird in einer picturebox dargestellt und ist ein "image" (kein bitmap)

also wird die anzahl der blauen (blauähnlichen) pixel von this.pictureBox1.Image gesucht.


Ich hoffe ich habe mich klar genug ausgedrückt und bin hier an die richtigen leute geraten.


Ps: benütze Microsoft Visual Studio 2008
 
P

paul_meiz

sorry für den doppel poast bin aber nicht angemeldet

habe vergessen zu erwähnen, dass die auswertung nich länger als 1 sec. dauern darf denke aber, dass das Zeitlimmit ausreichend ist.
Bin auch für teillösungen dankbar!
 

Shakie

Erfahrenes Mitglied
Du könntest ein Bitmap-Objekt erstellen, indem du dem Bitmap-Konstruktor das Image übergibst. Anschließend kannst du die Bitmap.GetPixel-Methode verwenden, um damit die Farbe jedes einzelnen Pixels zu überprüfen.
Wie lange das dauert hängt von der Größe des Bildes und deiner CPU ab.
 

600emaster

Grünschnabel
Da ich mal was ähnliches gemacht habe gebe ich dir mal die Funktion die ich verwende.
(Es ist nicht alles von mir aber teilweise optimiert. )

Code:
        public static int getBluePixelCount(Bitmap pBild)
        {
            int Count=0;
            if (pBild == null) return Count;
            // GDI+ still lies to us - the return format is BGR, NOT RGB.
            BitmapData bmData = pBild.LockBits(new Rectangle(0, 0, pBild.Width, pBild.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);


            int scanline = bmData.Stride;

            System.IntPtr Scan0 = bmData.Scan0;


            unsafe
            {
                byte* pSrc = (byte*)(void*)Scan0;
                byte r, g, b;

                int nOffset = bmData.Stride - pBild.Width * 3;


                int nWidth = pBild.Width;
                int nHeight = pBild.Height;
                int Offset;

                for (int yOffset = 0; yOffset < nHeight * scanline; yOffset += scanline)
                {
                    for (int xOffset = 0; xOffset < nWidth * 3; xOffset += 3)
                    {
                        Offset = yOffset + xOffset;
                        b = pSrc[Offset];                 // Blauanteil
                        g = pSrc[Offset + 1];             // Grünanteil
                        r = pSrc[Offset + 2];             // Rotanteil   
                        if (b > (r + g)) Count++;         // Sehr einfache Abfrage /bitte optimieren
                    }                    
                }
            }

            pBild.UnlockBits(bmData);
            //MessageBox.Show(Count+""); 
            return Count;
        }
(code tags von mod eingesetzt)

Du solltest natürlich noch die Abfrage ob der Pixel als blau angesehen wird anpassen.
 
Zuletzt bearbeitet von einem Moderator:

600emaster

Grünschnabel
Es ist C# Code.

Es ist doch .NET die Befehle für den Speicherzugriff (LockBits,UnlockBits) sind Teil des Frameworks.
Die Pointerzugriffe Teil des C# Sprachumfang.
 
P

paul_meiz

@ 600emaster
Danke für den code schnipsel
bei if (b > (r + g)) Count++;
werd ich wohl einen konstanten wert stat r + g nehmen, daher fällt denn auch die abfrage weck

@ alle

ich bin kein pro aber this.pictureBox1.Image is ja kein bitmap also müste ich's erst noch konvertieren oder?
wie mach ich dass?
wäre dankbar für nen code

MFG

Ps: Dannke an alle die sich meinem Problem annehmen