图像处理---椒盐噪声(杂点效果)

转自:图像处理:椒盐噪声(杂点)

Posted on 2008-10-28 16:07 parker 阅读(2794) 评论(0) 编辑 收藏

1.效果图:
           

2.实现原理:
           在处理每一个像素点时,取得一个随机值与指定的杂点出现概率的值进行判断,以决定是否修改当前像素点的颜色值,如果需要修改,则设定一个随机的颜色值。

3.实现代码:


 1        /// <summary>
 2        /// 添加杂点
 3         /// </summary>
 4        /// <param name="img">原始图像</param>
 5        /// <param name="degree">指定杂点出现的概率</param>
 6        /// <returns></returns>
 7        public static Image SaltNoise(Image img, int degree)
 8        {
 9            //设定概率在0--100
10            if (degree > 100) degree = 100;
11            if (degree < 0) degree = 0;
12
13            int width = img.Width;
14            int height = img.Height;
15
16            Rectangle rect = new Rectangle(0, 0, width, height);
17            PixelFormat pf = PixelFormat.Format32bppArgb;
18
19            //锁定Bitmap在内存中
20              Bitmap bmp = new Bitmap(img);            
21            BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadWrite, pf);
22
23            unsafe  //不安全模式
24            {
25                //图像中第一个像素数据的地址
26                  byte* p = (byte*)data.Scan0;
27                
28                Random rand = new Random();
29
30                for (int i = 0; i < height; i++)
31                {
32                    for (int j = 0; j < width; j++)
33                    {
34                        if (rand.Next(0, 100) < degree)
35                        {
36                            p[2] = (byte)rand.Next(0, 255);
37                            p[1] = (byte)rand.Next(0, 255);
38                            p[0] = (byte)rand.Next(0, 255);
39                        }
40                        p += 4;    //见下面说明
41                       }
42                 }
43
44            }
45            //从系统内存解锁此 Bitmap
46            bmp.UnlockBits(data);
47            //返回修改后的图像
48            return (Image)bmp;
49        }


 1        /// <summary>
 2        /// 添加杂点
 3         /// </summary>
 4        /// <param name="img">原始图像</param>
 5        /// <param name="degree">指定杂点出现的概率</param>
 6        /// <returns></returns>
 7        public static Image SaltNoiseMirco(Image img, int degree)
 8        {
 9            //设定概率在0---100
10            if (degree < 0) degree = 0;
11            if (degree > 100) degree = 100;
12
13            //取得原始图像的高宽值
14              int width = img.Width;
15            int height = img.Height;
16
17            //实例一个Bitmap
18            Bitmap bmp = new Bitmap(img);
19
20            Rectangle rect = new Rectangle(0, 0, width, height);
21            PixelFormat format = PixelFormat.Format32bppArgb;
22
23            BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadWrite, format);
24
25            IntPtr ptr = data.Scan0;
26
27            //申明固定长度的数组,以存放图像数据
28            int numBytes = width * height * 4;
29            byte[] rgbValues = new byte[numBytes];
30
31            //将图像数据从非托管内存指针复制到托管的数组
32            Marshal.Copy(ptr, rgbValues, 0, numBytes);
33
34            Random rand = new Random();
35
36            //修改符合条件的颜色值
37            for (int i = 0; i < numBytes; i +=4)
38            {
39                if (rand.Next(0, 100) < degree)
40                {
41                    rgbValues[i] = (byte)rand.Next(0, 255);
42                    rgbValues[i + 1] = (byte)rand.Next(0, 255);
43                    rgbValues[i + 2] = (byte)rand.Next(0, 255);                    
44                }
45            }
46
47            //将图像数据从托管的数组复制到非托管内存指针
48            Marshal.Copy(rgbValues, 0, ptr, numBytes);
49            bmp.UnlockBits(data);
50
51            return (Image)bmp;
52             
53        }

4.程序说明:
        A.利用LockBits方法做图像处理效率明显高于利用GetPixel方法和SetPixel方法,可比较与柔化(平滑)处理
        B.关于"方法一"
          (1)编译时可能会出现错误提示“不安全代码只会在使用 /unsafe 编译的情况下出现”,处理如下:
                 右击项目选择"属性"-->"生成"-->勾选"允许不安全代码"-->"保存"。
          (2)p += 4:
                 由于PixelFormat format = PixelFormat.Format32bppArgb;
                 指定图像中每个像素的颜色数据的格式为每像素 32 位;alpha、红色、绿色和蓝色分量各使用 8 位。
                 所以图像像素颜色值的存储用4个字节,分别表示B、G、R、A,各占一个字节,
                 p[0]:B、 p[1]:G、 p[2]:R、 p[3]:A,p+=4表示到当前像素的下一个像素的开始位置。
        C.关于"方法二"
          (1)Marshal.Copy()将图像数据从非托管内存指针复制到托管的数组,避免使用不安全代码。
          (2)int numBytes = width * height * 4;
                 存放图像像素数据的数组长度 = 总像素数 * 每个像素所占的字节数。

图像处理---椒盐噪声(杂点效果)

时间: 2024-10-09 04:54:59

图像处理---椒盐噪声(杂点效果)的相关文章

opencv中值滤波和低通滤波器对椒盐噪声处理的效果比较

opencv中值滤波和低通滤波器对椒盐噪声处理的效果比较 效果: 通过比较我们可以看出,中值滤波器有很好的保留了图像的边界信息 代码: void showimage(const std::string &str,const cv::Mat &image){ namedWindow(str,CV_WINDOW_AUTOSIZE); imshow(str,image); } Mat salt(const cv::Mat &image,int n){ Mat result = image

图像处理---灰度处理(黑白效果)

转自:图像处理:黑白效果(灰度处理) 1.效果图:         2.实现原理:        图像灰度化就是使色彩的三种颜色分量R.G.B的值相同,由于颜色值的取值范围是[0,255],所以灰度的        级别只有256种,即灰度图象仅能表现256种灰度颜色,常用有3种处理方法:        *最大值法(Maximum):R=G=B=Max(R,G,B),这种方法处理后灰度图象的亮度会偏高.        *平均值法(Average):R=G=B=(R+G+B)/3,这种方法处理后灰

图像处理之噪声---椒盐,白噪声,高斯噪声三种不同噪声的区别

白噪声是指功率谱密度在整个频域内均匀分布的噪声. 所有频率具有相同能量的随机噪声称为白噪声.白噪声或白杂讯,是一种功率频谱密度为常数的随机信号或随机过程.换句话说,此信号在各个频段上的功率是一样的,由于白光是由各种频率(颜色)的单色光混合而成,因而此信号的这种具有平坦功率谱的性质被称作是“白色的”,此信号也因此被称作白噪声.相对的,其他不具有这一性质的噪声信号被称为有色噪声. 而理想的白噪声具有无限带宽,因而其能量是无限大,这在现实世界是不可能存在的.实际上,我们常常将有限带宽的平整讯号视为白噪

matlab在空域与频域中去除周期噪声、椒盐噪声的简单应用

前言 去年图像处理的DLL,有学弟问我做的思路,便放到博客里 github地址,欢迎star 图像增强处理:设计一套空间域与频率域结合的图像增强算法,处理以下任一组图片中的带噪声图像,去除噪声,提高图像质量. (1)已知:噪声为随机噪声和周期噪声混合噪声: (2)要求: a)去噪处理后,计算均方误差评估去噪处理后图像的去噪效果 b)撰写完整的科技报告(形式类似科技论文)表述自己的算法设计,算法实现与算法评估过程. 对 swanNoise 图像去噪 空域去噪 根据老师讲解,swanNoise.bm

[数字图像处理]常见噪声的分类与Matlab实现

1.研究噪声特性的必要性 本文的内容主要介绍了常见噪声的分类与其特性.将噪声建模,然后用模型去实现各式各样的噪声. 实际生活中的各种照片的老化,都可以归结为以下老化模型. 这个模型很简单,也可以直接用以下公式来表达. 在频域内,用以下公式区表示. 根据以上式子,可以看出,老旧照片的复原,主要分为两个任务,一个是去噪:另一个是去卷积,或者称为逆滤波,也就是将老化滤波器做反处理. 本文首先由噪声类型与其建模.随后的博文,会介绍几种基础的去噪方法和基础的逆滤波方法. 2.噪声的实现 2.1    评价

给一幅图像添加椒盐噪声

2015-06-05 知识点: (1)像素值的存储 (2)引用的参数传递方式 (3)单通道和三通道图像像素访问的区别 代码如下: 1 #include "highgui.h" 2 #include "cxcore.h" 3 #include "cv.h" 4 #include "cmath" 5 6 void salt(cv::Mat &, int ); 7 8 9 int main() 10 { 11 cv::Mat

opencv初学习-椒盐噪声-中值滤波-均值滤波-腐蚀膨胀

#include <opencv2\opencv.hpp>#include <opencv2\highgui\highgui.hpp>#include <opencv2\imgcodecs\imgcodecs.hpp>#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<iomanip>void salt(cv

椒盐噪声

椒盐噪声 图像噪声之椒盐噪声(Salt And Pepper Noise) 概述: 椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素.椒盐噪声是一种因为信号脉冲强度引起的噪声,产生该噪声的算法也比较简单. 算法步骤: 我们使用信噪比(Signal NoiseRate)衡量图像噪声, 图象的信噪比应该等于信号与噪声的功率谱之比,但通常功率谱难以计算,有一种方法可以近似估计图象信噪比,即信号与噪声的方

opencv加椒盐噪声

void salt(IplImage *img, int saltNum) { int x,y; int i ; unsigned char *src = NULL; src = (unsigned char*)img->imageData; for(i = 0; i < saltNum; i++) { x = rand() % img->width; y = rand() % img->height; if(img->nChannels == 1) { src[y * im