c#给图像加高斯噪声

c#给图像加高斯噪声,第1张

/// <summary>

/// 高斯密度函数

/// </summary>

/森册// <param name="州烂z">随机数</param>

/// <param name="u">册春漏数学期望</param>

/// <param name="a">方差</param>

/// <returns></returns>

static double gossp(double z, double u, double a)

{

double p

p = ( 1 / (a * Math.Sqrt(2 * Math.PI)) *

Math.Pow( Math.E, -( Math.Pow(z - u,2) / (2 * a * a))))

return p

}

/// <summary>

/// 对一幅图形进行高斯噪音处理。

/// </summary>

/// <param name="img"></param>

/// <param name="u">数学期望</param>

/// <param name="a">方差</param>

/// <returns></returns>

static public Bitmap goss_noise(Image img, double u, double a)

{

int width = img.Width

int height = img.Height

Bitmap bitmap2 = new Bitmap(img)

Rectangle rectangle1 = new Rectangle(0, 0, width, height)

PixelFormat format = bitmap2.PixelFormat

BitmapData data = bitmap2.LockBits(rectangle1, ImageLockMode.ReadWrite, format)

IntPtr ptr = data.Scan0

int numBytes = width * height * 4

byte[] rgbValues = new byte[numBytes]

Marshal.Copy(ptr, rgbValues, 0, numBytes)

Random random1 = new Random()

for (int i = 0i <numBytesi += 4)

{

for (int j = 0j <3j++)

{

double z

z = random1.NextDouble() - 0.5 + u

double pz = gossp(z, u, a)

double r = random1.NextDouble()

// Debug.WriteLineIf(pz <0.1, string.Format("z={0}\tpz={1}\tr={2}", z,pz,r))

if (r <= pz)

{

double p = rgbValues[i + j]

p = p + z * 128

if (p >255)

p = 255

if (p <0)

p = 0

rgbValues[i + j] = (byte)p

}

}

}

Marshal.Copy(rgbValues, 0, ptr, numBytes)

bitmap2.UnlockBits(data)

return bitmap2

}

要回答这3个问题,需要你先理解概率密度函数的意义。

高斯密度函数的意义就是:

如果一个随机数发生很多次之后,其平均值为u, 并且其方差为a, 那么对于这个随机数序列中,出现一个特定的z值的概率是多少。

因此,需要先生成一个随机数z, 然后用高斯函数得知其发生的概率是多少。

也就是pz。

然后,知道这个z“应该”的发生概率是多少之后,我们就要想办法让他按这个概率作用于原图上的像素。

因此,再采用第二个随机数r, r是一个平均概率的0-1的数,因此,r小于等于pz的情况的概率正好等于pz。

因此,如果在r小于等于pz时,z这个随机量发生作用,那么z的概率就是pz了。

这样循环处理,对于n个z,他的概率就客观上服从高斯分布了。

最后,关于为何 - 0.5 的原因:

这涉及到z的值域问题。

原理上讲,如果产生的噪音在-128到+128之间,数学期望为0,而方差为0.1时,对于所产生的z(一般情况下都在几十的值段),其概率几乎为0,导致根本不可能产生可见的干扰。

因此,我考虑到是否采用-0.5到+0.5的z值,这样在方差为0.1的情况下,z的概率才大到足以产生足够多的噪音。

但是,这样一来,z的值就太小了,只是-0.5到+0.5的区间,对图像的干扰非常不明显,于是我试着把z看为一个比例值,放大z到-128到+128的区间,这样处理完之后,对图像的干扰就大到足以观察到效果。

自己产生[x,y] 2维随机数,用分布携历函数为权,取用点的个数就可以了。如考虑中心对称,用极座标[r,sita] 也辩毁搜许余孝更方便。

2维椒盐噪声,即产生[x,y,1] 和 [x,y,0], 1 是白点,0是黑点。

计算机的伪随机数,就是白噪声,均匀分布。

工程中,需要检验某一系统的稳定性是,可以在输入信号中加如微小的噪声。高斯噪声是最常用的一种。请问如何用C/C++编写生成高斯噪声的程序?具体要求:采样点数为1000,噪声均值为0,噪声仿羡变化范围为-5到-5。 满意答案ヤ1﹎.隻潴oo8级2008-06-20我没有做过这方面的研究,但是有个思路,因为图像的每一个像素由RGB三个分量组成,您先建立一个备备拍函数将其转换成一个数据,X= f(R,G,B),确定其数值范围,再在X里面添加噪声,什么高斯噪声、随机噪声、椒盐噪声从计算机滚乱图像处理的教材里面可以查到生成方法,添加噪声以后,在反算成RGB,重新写回原来的像素位置就可以了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11995737.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存