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;
}