LitDev.Engines.FIP.Blurring C# (CSharp) Method

Blurring() public method

Image bluring
public Blurring ( Bitmap OriginalImage, int X, int Y, Double r ) : Bitmap
OriginalImage System.Drawing.Bitmap Original ARGB image
X int Horizontal coordinate
Y int Vertical coordinate
r Double Sharp region radius
return System.Drawing.Bitmap
        public Bitmap Blurring(Bitmap OriginalImage, int X, int Y, Double r)
        {
            int M = OriginalImage.Width;
            int N = OriginalImage.Height;

            if (X < 0 || X >= M || Y < 0 || Y >= N)
            {
                throw new Exception("Center of sharp region must be in dimensions of image");
            }

            Bitmap blur = new Bitmap(M, N);

            for (int i = 0; i < M; i++)
            {
                for (int j = 0; j < N; j++)
                {

                    Double H = Math.Abs(Convert.ToDouble(i) - Convert.ToDouble(X));
                    Double V = Math.Abs(Convert.ToDouble(j) - Convert.ToDouble(Y));
                    Double R = Math.Sqrt(H * H + V * V);

                    if (R <= r)
                    {
                        blur.SetPixel(i, j, OriginalImage.GetPixel(i, j));
                    }
                    else
                    {
                        Double sigma = 0.1 + (6 - 0.1) * Convert.ToDouble(R) / Convert.ToDouble(2 * r);

                        List<Double> Filter = new List<double>();

                        for (int k = 0; k < 1000; k++)
                        {
                            Double K = Convert.ToDouble(k);
                            Double gauss = (1 / (Math.Sqrt(2 * Math.PI) * sigma)) * Math.Exp(-K * K / (2 * sigma * sigma));

                            if (gauss < 0.003)
                            {
                                break;
                            }
                            else
                            {
                                Filter.Add(gauss);
                            }
                        }

                        Double licznikR = Filter[0] * Convert.ToDouble(OriginalImage.GetPixel(i, j).R);
                        Double licznikG = Filter[0] * Convert.ToDouble(OriginalImage.GetPixel(i, j).G);
                        Double licznikB = Filter[0] * Convert.ToDouble(OriginalImage.GetPixel(i, j).B);

                        Double mianownik = Filter[0];

                        for (int a = 1; a < Filter.Count; a++)
                        {

                            mianownik += 2 * Filter[a];

                        }

                        for (int b = 1; b < Filter.Count; b++)
                        {

                            int x = i;
                            int y1 = j - b;
                            int y2 = j + b;

                            if (y1 < 0)
                            {
                                y1 = Math.Abs(y1);
                            }
                            else if (y2 >= N)
                            {
                                y2 = y2 + b - N + 1;
                            }
                            else
                            {

                                licznikR += Filter[b] * (Convert.ToDouble(OriginalImage.GetPixel(i, y1).R) + Convert.ToDouble(OriginalImage.GetPixel(i, y2).R));
                                licznikG += Filter[b] * (Convert.ToDouble(OriginalImage.GetPixel(i, y1).G) + Convert.ToDouble(OriginalImage.GetPixel(i, y2).G));
                                licznikB += Filter[b] * (Convert.ToDouble(OriginalImage.GetPixel(i, y1).B) + Convert.ToDouble(OriginalImage.GetPixel(i, y2).B));

                            }

                        }

                        int newR = (int)(licznikR / mianownik);
                        int newG = (int)(licznikG / mianownik);
                        int newB = (int)(licznikB / mianownik);

                        if (newR > 255) newR = 255; if (newR < 0) newR = 0;
                        if (newG > 255) newG = 255; if (newG < 0) newG = 0;
                        if (newB > 255) newB = 255; if (newB < 0) newB = 0;

                        blur.SetPixel(i, j, Color.FromArgb(255, newR, newG, newB));
                    }

                }
            }

            return blur;
        }