博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

图象处理算法(四)

Posted on 2007-03-01 09:54  faib  阅读(640)  评论(1)    收藏  举报
四、加噪
  本函数完成的功能是对图像进行加噪处理,参数Level是噪音的严重程度,Step是范围大小。函数的unsafe代码部分对每个象素点的不同颜色成分进行逐个处理,通过随机产生的值,来决定增或减的大小。函数最后执行成功后,同样得返回true值。
 1        public static bool Noise(Bitmap b, int Level, int Step)
 2        {
 3            BitmapData bmData = b.LockBits(new Rectangle(00, b.Width, b.Height), 
 4                ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
 5            int stride = bmData.Stride;
 6            System.IntPtr Scan0 = bmData.Scan0;
 7            unsafe
 8            {
 9                byte * p = (byte *)(void *)Scan0;
10                int nOffset = stride - b.Width*3;
11                int blue = 0, green = 0, red = 0;
12                Random rad = new Random();
13                for(int y=0;y<b.Height;++y)
14                {
15                    for(int x=0; x < b.Width; ++x )
16                    {
17                        if(y % Step == 0 && x % Step == 0)
18                        {
19                            int mLev = rad.Next(2 * Level) - Level;
20                            blue = p[0+ mLev;
21                            green = p[1+ mLev;
22                            red = p[2+ mLev;
23                            if(blue < 0)blue = 0;
24                            else if(blue > 255)blue = 255;
25                            if(green < 0)green = 0;
26                            else if(green > 255)green = 255;
27                            if(red < 0)red = 0;
28                            else if(red > 255)red = 255;
29                            p[0= (byte)blue;
30                            p[1= (byte)green;
31                            p[2= (byte)red;
32                        }

33                        p += 3;
34                    }

35                    p += nOffset;
36                }

37            }

38            b.UnlockBits(bmData);
39            return true;
40        }