Размытие по Гауссу - C#
Формулировка задачи:
Ребят, помогите пожалуйста с размытием(конечная цель восстановления размытия по Гауссу).
Программа размывает только верхний участок изображения.
Заранее благодарю
unsafe void Transform(Bitmap bmp)
{
var bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
int s = Image.GetPixelFormatSize(bmp.PixelFormat) / 8; // число бит на пиксель
int width = bmp.Width * s, height = bmp.Height;
byte[, ,] res = new byte[3, height, width];
double acR,acG,acB;
int radius = 30;
int size = 2 * radius + 6;
for (int h = 0; h < height; h++)
{
for (int w = 0; w < width; w = w + s)
{
byte* curpos = (byte*)bd.Scan0 + h * bd.Stride;
int R = curpos[w];
int G = curpos[w + 1];
int B = curpos[w + 2];
acR = R * (Math.Pow((double)Math.E, -(Math.Pow((double)w - size / 2, 2) + Math.Pow((double)h - size / 2, 2)) / (2 * Math.Pow((double)radius, 2))));
acG = G * (Math.Pow((double)Math.E, -(Math.Pow((double)w - size / 2, 2) + Math.Pow((double)h - size / 2, 2)) / (2 * Math.Pow((double)radius, 2))));
acB = B * (Math.Pow((double)Math.E, -(Math.Pow((double)w - size / 2, 2) + Math.Pow((double)h - size / 2, 2)) / (2 * Math.Pow((double)radius, 2))));
curpos[ w ] = (byte)acR;
curpos[w + 1] = (byte)acG;
curpos[w + 2] = (byte)acB;
}
}Решение задачи: «Размытие по Гауссу»
textual
Листинг программы
int gaussCoef(double sigma, double a[3], double *b0)
{
double sigma_inv_4;
sigma_inv_4 = sigma*sigma; sigma_inv_4 = 1.0/(sigma_inv_4*sigma_inv_4);
double coef_A = sigma_inv_4*(sigma*(sigma*(sigma*1.1442707+0.0130625)-0.7500910)+0.2546730);
double coef_W = sigma_inv_4*(sigma*(sigma*(sigma*1.3642870+0.0088755)-0.3255340)+0.3016210);
double coef_B = sigma_inv_4*(sigma*(sigma*(sigma*1.2397166-0.0001644)-0.6363580)-0.0536068);
double z0_abs = exp(coef_A);
double z0_real = z0_abs*cos(coef_W);
double z0_im = z0_abs*sin(coef_W);
double z2 = exp(coef_B);
double z0_abs_2 = z0_abs*z0_abs;
a[2] = 1.0/(z2*z0_abs_2);
a[0] = (z0_abs_2+2*z0_real*z2)*a[2];
a[1] = -(2*z0_real+z2)*a[2];
*b0 = 1.0 - a[0] - a[1] - a[2];
return 0;
};