public static Bitmap ApplyMedianPassFilter(Bitmap sourceBitmap, eMedianFilterQuality quality)
        {
            BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(0, 0,
                                                                        sourceBitmap.Width, sourceBitmap.Height),
                                                          ImageLockMode.ReadOnly,
                                                          PixelFormat.Format32bppArgb);

            byte[] pixelBuffer  = new byte[sourceData.Stride * sourceData.Height];
            byte[] resultBuffer = new byte[sourceData.Stride * sourceData.Height];

            Marshal.Copy(sourceData.Scan0, pixelBuffer, 0, pixelBuffer.Length);
            sourceBitmap.UnlockBits(sourceData);

            var qualityValue     = (int)(quality);
            var neighborsOffset  = qualityValue / 2;
            var mediumValueIndex = (qualityValue * qualityValue + 1) / 2;

            for (int imageOffsetX = neighborsOffset; imageOffsetX < sourceBitmap.Height - neighborsOffset; imageOffsetX++)
            {
                for (int imageOffsetY = neighborsOffset; imageOffsetY < sourceBitmap.Width - neighborsOffset; imageOffsetY++)
                {
                    var centralPixelPos = (sourceData.Stride * imageOffsetX) + (imageOffsetY * BYTES_PER_PIXEL);

                    var blueValues  = new byte[qualityValue * qualityValue];
                    var greenValues = new byte[qualityValue * qualityValue];
                    var redValues   = new byte[qualityValue * qualityValue];
                    var posOnArray  = 0;

                    for (int offsetX = -neighborsOffset; offsetX <= neighborsOffset; offsetX++)
                    {
                        for (int offsetY = -neighborsOffset; offsetY <= neighborsOffset; offsetY++)
                        {
                            var currentPixelPos = (sourceData.Stride * (imageOffsetX + offsetX)) + (offsetY + imageOffsetY) * BYTES_PER_PIXEL;

                            blueValues[posOnArray]  = pixelBuffer[currentPixelPos];
                            greenValues[posOnArray] = pixelBuffer[currentPixelPos + 1];
                            redValues[posOnArray]   = pixelBuffer[currentPixelPos + 2];

                            posOnArray++;
                        }
                    }

                    resultBuffer[centralPixelPos]     = blueValues.OrderBy(v => v).ElementAt(mediumValueIndex);
                    resultBuffer[centralPixelPos + 1] = greenValues.OrderBy(v => v).ElementAt(mediumValueIndex);
                    resultBuffer[centralPixelPos + 2] = redValues.OrderBy(v => v).ElementAt(mediumValueIndex);
                    resultBuffer[centralPixelPos + 3] = 255;
                }
            }

            return(BitmapHelper.CreateNewBitmapFrom(sourceBitmap, resultBuffer));
        }
        private void ApplyMedianFilter(eMedianFilterQuality quality)
        {
            var result = ImageManipulator.ApplyMedianPassFilter(_originalImage, quality);

            Image = BitmapHelper.BitmapToBitmapImage(result);
        }