Accord.Imaging.Filters.GrayWorld.ProcessFilter C# (CSharp) Method

ProcessFilter() protected method

Process the filter on the specified image.
protected ProcessFilter ( UnmanagedImage image ) : void
image Accord.Imaging.UnmanagedImage Source image data.
return void
        protected unsafe override void ProcessFilter(UnmanagedImage image)
        {
            int width = image.Width;
            int height = image.Height;

            int pixelSize = System.Drawing.Image.GetPixelFormatSize(image.PixelFormat) / 8;
            int stride = image.Stride;
            int offset = stride - image.Width * pixelSize;


            // Get image means
            double Rmean = 0, Gmean = 0, Bmean = 0;

            byte* src = (byte*)image.ImageData.ToPointer();

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++, src += pixelSize)
                {
                    Rmean += src[RGB.R];
                    Gmean += src[RGB.G];
                    Bmean += src[RGB.B];
                }

                src += offset;
            }

            double size = width * height;
            Rmean /= size;
            Gmean /= size;
            Bmean /= size;

            double mean = (Rmean + Gmean + Bmean) / 3.0;

            double kr = mean / Rmean;
            double kg = mean / Gmean;
            double kb = mean / Bmean;

            src = (byte*)image.ImageData.ToPointer();
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++, src += pixelSize)
                {
                    double r = kr * src[RGB.R];
                    double g = kg * src[RGB.G];
                    double b = kb * src[RGB.B];

                    src[RGB.R] = (byte)(r > 255 ? 255 : r);
                    src[RGB.G] = (byte)(g > 255 ? 255 : g);
                    src[RGB.B] = (byte)(b > 255 ? 255 : b);
                }

                src += offset;
            }
        }
    }