文档库 最新最全的文档下载
当前位置:文档库 › 图像高斯滤波c#完整代码

图像高斯滤波c#完整代码

private void menuItem11_Click(object sender, EventArgs e)
{
if (pictureBox1.Image != null)
{
gauss Gauss = new gauss();

if (Gauss.ShowDialog() == DialogResult.OK)
{
double sigma = Gauss.GetSigma;

int mask = Convert.ToInt32(Math.Ceiling(3.0 * sigma));

Bitmap bm1 = new Bitmap(pictureBox1.Image);
Bitmap bmGauss = new Bitmap(bm1.Width, bm1.Height);

double[,] GaussSmooth = smooth(bm1, sigma);

for (int i = 0; i < bmGauss.Width; i++)
{
for (int j = 0; j < bmGauss.Height; j++)
{
int pix = (int)(GaussSmooth[i, j] * 255);

if (pix < 0)
pix = 0;
else if (pix > 255)
pix = 255;

bmGauss.SetPixel(i, j, Color.FromArgb(pix, pix, pix));
}
}

pictureBox2.Refresh();
pictureBox2.Image = bmGauss;
label2.Text = "高斯滤波";
}
}
}

public double[,] ImagedateRGB(Bitmap bm) //图像的值
{
Color c = new Color();

int BmIw = bm.Width;
int BmIh = bm.Height;

double[,] Imagedate = new double[BmIw, BmIh];

for (int i = 0; i < BmIw; i++)
{
for (int j = 0; j < BmIh; j++)
{
c = bm.GetPixel(i, j);
Imagedate[i, j] = (double)(0.299 * c.R + 0.587 * c.G + 0.114 * c.B);
}
}

return Imagedate;
}

public double[,] fliter(double sigma) //高斯滤波模板数值
{
int mask = Convert.ToInt32(Math.Ceiling(3.0 * sigma));

double[,] Gaussfliter = new double[2 * mask + 1, 2 * mask + 1];

double a = 1.0 / (2 * sigma * sigma);

double sum = 0.0;

for (int i = 0; i <= 2 * mask; i++)
{
for (int j = 0; j <= 2 * mask; j++)
{
Gaussfliter[i, j] = Math.Exp(-1.0 *((i - mask) * (i - mask) + (j - mask) * (j - mask)) * a);
sum += Gaussfliter[i, j];
}
}

for (int i = 0; i <= 2 * mask; i++)
{
for (int j = 0; j <= 2 * mask; j++)
{
Gaussfliter[i, j] /= sum;
}
}

return Gaussfliter;
}

public double[,] newImage(Bitmap bm, int mask) //图像扩边
{
double[,] data = ImagedateRGB(bm);
dou

ble[,] newImagedata = new double[bm.Width + 2 * mask, bm.Height + 2 * mask];

for (int i = mask; i < bm.Width + mask; i++) //输入图像的数据拷贝到新图像的中心位置
{
for (int j = mask; j < bm.Height + mask; j++)
{
newImagedata[i, j] = data[i - mask, j - mask];
}
}

for (int i = mask; i < bm.Width + mask; i++) //上边界
{
for (int j = 0; j < mask; j++)
{
newImagedata[i, j] = newImagedata[i, j + mask];
}
}

for (int i = mask; i < bm.Width + mask; i++) //下边界
{
for (int j = bm.Height + mask; j < bm.Height + 2 * mask; j++)
{
newImagedata[i, j] = newImagedata[i, j - mask];
}
}

for (int i = 0; i < mask; i++) //左边界
{
for (int j = 0; j < bm.Height + 2 * mask; j++)
{
newImagedata[i, j] = newImagedata[i + mask, j];
}
}

for (int i = bm.Width + mask; i < bm.Width + 2 * mask; i++) //右边界
{
for (int j = 0; j < bm.Height + 2 * mask; j++)
{
newImagedata[i, j] = newImagedata[i - mask, j];
}
}

return newImagedata;
}

public double[,] smooth(Bitmap bm, double sigma) //高斯滤波
{
int mask = Convert.ToInt32(Math.Ceiling(3.0 * sigma));

double[,] NewImage = newImage(bm, mask);
double[,] image = new double[bm.Width, bm.Height];

double[,] Gaussfliter = fliter(sigma);

for (int i = mask; i < bm.Width + mask; i++) //滤波相乘
{
for (int j = mask; j < bm.Height + mask; j++)
{
for (int u = 0; u <= 2 * mask; u++)
{
for (int v = 0; v <= 2 * mask; v++)
{
NewImage[i, j] += NewImage[i - mask + u, j - mask + v] * Gaussfliter[u, v];
}
}
}
}

for (int i = 0; i < bm.Width; i++)
{
for (int j = 0; j < bm.Height; j++)
{
image[i, j] = NewImage[i + mask, j + mask];
}
}

double max = image[0, 0];
for (int i = 0; i < bm.Width; i++)
{
for (int j = 0; j < bm.Height; j++)
{
if (image[i, j] > max)
max = image[i, j];
}
}

for (int i = 0; i < bm.Width; i++)
{

for (int j = 0; j < bm.Height; j++)
{
image[i, j] /= max;
}
}

return image;
}

相关文档
相关文档 最新文档