您现在所在位置: 首页 > 新闻中心

挑选婚纱照相框必须了解的小知识

2021-03-31 06:28:05
浏览: 96次 来源:【jake】 作者:-=Jake=-
返回列表

图像噪声是影响人们对图像信息的接受程度的因素。常见的噪声包括高斯噪声,盐和胡椒噪声。由于最近的课程要求,请执行图像恢复项目c 高斯噪声,因此我掌握了在图像中添加噪点和消除噪点的方法。

为图像添加高斯噪声

高斯噪声是由于将大量具有正态分布随机变量属性的值添加到原始图像而引起的。为了将高斯噪声添加到图像澳洲幸运10app下载 ,问题在于如何生成正态分布的随机变量。首先,使用Randdom对象的NextDouble生成0-1之间的两个随机变量r1,r2,然后进行计算

           double result = Math.Sqrt((-2) * Math.Log(r2)) * Math.Sin(2 * Math.PI * r1);

获得的结果是平均值为0华体会登录 ,方差为1的正态分布随机变量。这是Box-Muller方法,算法推导非常复杂,但是实现起来非常方便。因为当将高斯噪声添加到图像时,需要为每个像素生成r1和r2才能获得噪声,这需要快速华体会官网 ,大规模地生成随机变量。首先,我发现生成的随机变量始终连续相同,这意味着在短时间内生成的随机数是相同的凤凰体育 ,因为毕竟C#Random会生成伪随机数c 高斯噪声,这些伪随机数是通过以下方式计算的:某种算法,并基于“种子”进行计算。默认情况下,它基于计算机。时间是计算出来的,但是当大量这样的随机数很快时,由于计算机时间不是一个好的“种子”,因此将连续生成相同的随机数。所以我在程序中使用了这种方法:

        static int GetRandomSeed( ) //产生随机种子
       { 
            byte[] bytes = new byte[4]; 
            System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider( ); 
            rng.GetBytes( bytes ); 
            return BitConverter.ToInt32( bytes , 0 ); 
       } 
        public double GaussNiose1()//用box muller的方法产生均值为0,方差为1的正太分布随机数
        {
           // Random ro = new Random(10);
           // long tick = DateTime.Now.Ticks;
            Random ran = new Random(GetRandomSeed());
           // Random rand = new Random();
            double r1 = ran.NextDouble();
            double r2 = ran.NextDouble();
            double result = Math.Sqrt((-2) * Math.Log(r2)) * Math.Sin(2 * Math.PI * r1);
            return result;//返回随机数
        }

通过这种方式解决了问题,并且可以在短时间内快速生成随机数。

在图像中添加盐和胡椒粉噪声

添加盐和胡椒粉噪音的方法如下:

 private void AddSalt(object sender, EventArgs e)
        {
            if (textBox12.Text != "" && textBox13.Text != "")
            {
               // Bitmap pic = (Bitmap)Bitmap.FromFile(filename, false);
                Bitmap pic = new Bitmap(pictureBox2.Image, WI, HE);
                double Pa = Convert.ToDouble(textBox12.Text);//接受输入的Pa
                double Pb = Convert.ToDouble(textBox13.Text);//接受输入的Pb
                double P = Pb / (1 - Pa);//程序要,为了得到一个概率Pb事件
                int width = pic.Width;
                int height = pic.Height;
                Random rand = new Random();
                for (int i = 0; i < height; i++)
                {
                    for (int j = 0; j < width; j++)
                    {
                        int gray;
                        int noise = 1;
                        double probility = rand.NextDouble();
                        if (probility < Pa)
                        {
                            noise = 255;//有Pa概率 噪声设为最大值
                        }
                        else
                        {
                            double temp = rand.NextDouble();
                            if (temp < P)//有1 - Pa的几率到达这里,再乘以 P ,刚好等于Pb
                                noise = 0;
                        }
                        if (noise != 1)
                        {
                            gray = noise;
                        }
                        else gray = pic.GetPixel(j, i).R;
                        Color color = Color.FromArgb(gray, gray, gray);
                        pic.SetPixel(j, i, color);
                    }
                }
                Form2 f2 = new Form2();
                f2.change_size(pic);
                f2.Setname("图像添加椒盐噪声之后的图像,需要还原的话请先保存然后再打开^_^");
                f2.Show();
            }
            else
            {
                MessageBox.Show("请先输入Pa和Pb^_^");
            }
        }

图像恢复(中值过滤)

对于每个像素亚博app ,取出周围的9个像素,将它们存储在过滤器中,然后对数组进行排序,最后将中间值作为目标值。下面的程序是使用插入排序方法同时对值进行排序。

   private void MedianFilter(object sender, EventArgs e)
        {
            Bitmap pic = new Bitmap(pictureBox2.Image, WI, HE);
            int width = pic.Width;
            int height = pic.Height;
            int[,] resultPic = new int[height, width];
            int index;
            int[] filter = new int[9];
            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    index = 0;
                    int nowGray;
                    for (int ii = -1; ii < 2; ii++)
                    {
                        for (int jj = -1; jj < 2; jj++)
                        {
                            if (j + jj >= 0 && j + jj < width && i + ii >= 0 && i + ii < height)
                           {
                                nowGray = pic.GetPixel(j + jj, i + ii).R;
                           }
                            else { nowGray = 0; }
                                if (index == 0) { filter[index] = nowGray; index++; }
                                else
                                {
                                    if (nowGray >= filter[index-1])
                                    {
                                        filter[index++] = nowGray;
                                    }
                                    else
                                    {
                                        int current = index-1;
                                        while (current > 0 && filter[current] > nowGray)
                                        {
                                            filter[current + 1] = filter[current];
                                            current--;
                                        }
                                        filter[current+1] = nowGray;
                                        index++;
                                    }
                                  
                                }
                            
                           
                        }
                    }
                    resultPic[i,j] = filter[4];
                   // int temp = filter[4];
                  //  Color color = Color.FromArgb(temp, temp, temp);
                   // pic.SetPixel(j, i, color);
                }
            }
            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    int temp = resultPic[i,j];
                    Color color = Color.FromArgb(temp, temp, temp);
                    pic.SetPixel(j, i, color);
                }
            }
            Form2 f2 = new Form2();
            f2.change_size(pic);
            f2.Setname("中值滤波之后的图像");
            f2.Show();
        }

以下是添加了椒盐噪声(Pa = Pb 0. 2)和中值滤波处理后的图像

c 高斯噪声

c 高斯噪声

老王


搜索