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

ProcessFilter() protected method

Process the filter on the specified image.
protected ProcessFilter ( UnmanagedImage sourceData, UnmanagedImage destinationData ) : void
sourceData UnmanagedImage Source image data.
destinationData UnmanagedImage Destination image data.
return void
        protected override unsafe void ProcessFilter(UnmanagedImage sourceData, UnmanagedImage destinationData)
        {
            int pixelSize = Image.GetPixelFormatSize(sourceData.PixelFormat) / 8;

            // get width and height
            int width = sourceData.Width;
            int height = sourceData.Height;

            int srcOffset = sourceData.Stride - width * pixelSize;
            int dstOffset = destinationData.Stride - width;
            RGB rgb = new RGB();
            YCbCr ycbcr = new YCbCr();

            // do the job
            byte* src = (byte*)sourceData.ImageData.ToPointer();
            byte* dst = (byte*)destinationData.ImageData.ToPointer();
            byte v = 0;

            // for each row
            for (int y = 0; y < height; y++)
            {
                // for each pixel
                for (int x = 0; x < width; x++, src += pixelSize, dst++)
                {
                    rgb.Red = src[RGB.R];
                    rgb.Green = src[RGB.G];
                    rgb.Blue = src[RGB.B];

                    // convert to YCbCr
                    Accord.Imaging.YCbCr.FromRGB(rgb, ycbcr);

                    switch (channel)
                    {
                        case YCbCr.YIndex:
                            v = (byte)(ycbcr.Y * 255);
                            break;

                        case YCbCr.CbIndex:
                            v = (byte)((ycbcr.Cb + 0.5) * 255);
                            break;

                        case YCbCr.CrIndex:
                            v = (byte)((ycbcr.Cr + 0.5) * 255);
                            break;
                    }

                    *dst = v;
                }
                src += srcOffset;
                dst += dstOffset;
            }
        }
    }