Ejemplo n.º 1
0
        public static double GaussNoise(double u, double d)
        {
            double u1, u2, z, x;

            //Random ram = new Random();
            if (d <= 0)
            {
                return(u);
            }
            u1 = (new Random(ToolFunctions.GetRandomSeed())).NextDouble();
            u2 = (new Random(ToolFunctions.GetRandomSeed())).NextDouble();

            z = Math.Sqrt(-2 * Math.Log(u1)) * Math.Sin(2 * Math.PI * u2);

            x = u + d * z;
            return(x);
        }
Ejemplo n.º 2
0
        public static void AddPepperSalt(Bitmap srcBmp, double Pa, double Pb, out Bitmap dstBmp)
        {
            // Bitmap pic = (Bitmap)Bitmap.FromFile(filename, false);
            dstBmp = srcBmp;
            Bitmap          tmpBmp  = (Bitmap)dstBmp.Clone();
            double          P       = Pb / (1 - Pa);//程序要,为了得到一个概率Pb事件
                        int width   = dstBmp.Width;
            int             height  = dstBmp.Height;
            Random          rand    = new Random(ToolFunctions.GetRandomSeed());
            Rectangle       rt      = new Rectangle(0, 0, srcBmp.Width, srcBmp.Height);
            BitmapData      bmpData = tmpBmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            Task            t1      = new Task(() =>
            {
                unsafe
                {
                    for (int i = 0; i < bmpData.Height / 2; i++)
                    {
                        byte *ptr = (byte *)bmpData.Scan0 + i * bmpData.Stride;
                        for (int j = 0; j < bmpData.Width / 2; j++)
                        {
                            double probility = rand.NextDouble();
                            rand.NextDouble();
                            if (probility == 0)
                            {
                                rand = new Random(ToolFunctions.GetRandomSeed());
                                //probility = rand.NextDouble();
                            }
                            if (probility < Pa)
                            {
                                //noiseC = Color.White;//有Pa概率 噪声设为最大值
                                *(ptr + j * 3)     = 255; //B
                                *(ptr + j * 3 + 1) = 255; //G
                                *(ptr + j * 3 + 2) = 255; //R
                                //Console.WriteLine("probility:"+probility);
                            }
                            else
                            {
                                double temp = rand.NextDouble();
                                if (temp < P)               //有1 - Pa的几率到达这里,再乘以 P ,刚好等于Pb
                                {
                                    *(ptr + j * 3)     = 0; //B
                                    *(ptr + j * 3 + 1) = 0; //G
                                    *(ptr + j * 3 + 2) = 0; //R
                                }
                            }
                        }
                    }
                }
                //tmpBmp.UnlockBits(bmpData);
            });
            Task t2 = new Task(() =>
            {
                //BitmapData bmpData = tmpBmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                unsafe
                {
                    for (int i = bmpData.Height / 2; i < bmpData.Height; i++)
                    {
                        byte *ptr = (byte *)bmpData.Scan0 + i * bmpData.Stride;
                        for (int j = 0; j < bmpData.Width / 2; j++)
                        {
                            double probility = rand.NextDouble();
                            if (probility == 0)
                            {
                                rand = new Random(ToolFunctions.GetRandomSeed());
                                //probility = rand.NextDouble();
                            }
                            if (probility < Pa)
                            {
                                //noiseC = Color.White;//有Pa概率 噪声设为最大值
                                *(ptr + j * 3)     = 255; //B
                                *(ptr + j * 3 + 1) = 255; //G
                                *(ptr + j * 3 + 2) = 255; //R
                                                          //Console.WriteLine("probility:"+probility);
                            }
                            else
                            {
                                double temp = rand.NextDouble();
                                if (temp < P)               //有1 - Pa的几率到达这里,再乘以 P ,刚好等于Pb
                                {
                                    *(ptr + j * 3)     = 0; //B
                                    *(ptr + j * 3 + 1) = 0; //G
                                    *(ptr + j * 3 + 2) = 0; //R
                                }
                            }
                        }
                    }
                }
                //tmpBmp.UnlockBits(bmpData);
            });
            Task t3 = new Task(() =>
            {
                //BitmapData bmpData = tmpBmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                unsafe
                {
                    for (int i = 0; i < bmpData.Height / 2; i++)
                    {
                        byte *ptr = (byte *)bmpData.Scan0 + i * bmpData.Stride;
                        for (int j = bmpData.Width / 2; j < bmpData.Width; j++)
                        {
                            double probility = rand.NextDouble();
                            if (probility == 0)
                            {
                                rand = new Random(ToolFunctions.GetRandomSeed());
                                //probility = rand.NextDouble();
                            }
                            if (probility < Pa)
                            {
                                //noiseC = Color.White;//有Pa概率 噪声设为最大值
                                *(ptr + j * 3)     = 255; //B
                                *(ptr + j * 3 + 1) = 255; //G
                                *(ptr + j * 3 + 2) = 255; //R
                                                          //Console.WriteLine("probility:"+probility);
                            }
                            else
                            {
                                double temp = rand.NextDouble();
                                if (temp < P)               //有1 - Pa的几率到达这里,再乘以 P ,刚好等于Pb
                                {
                                    *(ptr + j * 3)     = 0; //B
                                    *(ptr + j * 3 + 1) = 0; //G
                                    *(ptr + j * 3 + 2) = 0; //R
                                }
                            }
                        }
                    }
                }
                //tmpBmp.UnlockBits(bmpData);
            });
            Task t4 = new Task(() =>
            {
                //BitmapData bmpData = tmpBmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                unsafe
                {
                    int i = bmpData.Height / 2;

                    for (; i < bmpData.Height; i++)
                    {
                        byte *ptr = (byte *)bmpData.Scan0 + i * bmpData.Stride;
                        for (int j = bmpData.Width / 2; j < bmpData.Width; j++)
                        {
                            double probility = rand.NextDouble();
                            if (probility == 0)
                            {
                                rand = new Random(ToolFunctions.GetRandomSeed());
                                //probility = rand.NextDouble();
                            }
                            if (probility < Pa)
                            {
                                //noiseC = Color.White;//有Pa概率 噪声设为最大值
                                *(ptr + j * 3)     = 255; //B
                                *(ptr + j * 3 + 1) = 255; //G
                                *(ptr + j * 3 + 2) = 255; //R
                                                          //Console.WriteLine("probility:"+probility);
                            }
                            else
                            {
                                double temp = rand.NextDouble();
                                if (temp < P)               //有1 - Pa的几率到达这里,再乘以 P ,刚好等于Pb
                                {
                                    *(ptr + j * 3)     = 0; //B
                                    *(ptr + j * 3 + 1) = 0; //G
                                    *(ptr + j * 3 + 2) = 0; //R
                                }
                            }
                        }
                    }
                    Console.WriteLine("over t4:" + i);
                }
                //tmpBmp.UnlockBits(bmpData);
            });


            t1.Start();
            t2.Start();
            t3.Start();
            t4.Start();
            //t1.Wait();

            //t2.Wait();
            Task.WaitAll(t1, t2, t3, t4);
            tmpBmp.UnlockBits(bmpData);
            dstBmp = tmpBmp;
            //for (int i = 0; i < height; i++)
            //{
            //    for (int j = 0; j < width; j++)
            //    {
            //        Color noiseC = dstBmp.GetPixel(j, i);
            //        double probility = rand.NextDouble();
            //        if (probility < Pa)
            //        {
            //            noiseC = Color.White;//有Pa概率 噪声设为最大值
                        //        }
                        //        else
                        //        {
                        //            double temp = rand.NextDouble();
                        //            if (temp < P)//有1 - Pa的几率到达这里,再乘以 P ,刚好等于Pb
                        //                noiseC = Color.Black;
                        //        }

            //        Color color = noiseC;
            //        dstBmp.SetPixel(j, i, color);
            //    }
            //}
        }