MATLAB 给图像添加噪声的命令为
imnoise
该函数的基本语法为:
g=imnoise(f,type,parameters)
f为是输入图像。函数imnoise在给图像添加噪声之前,将它转换为范围[0,1]内的double类图像。指定噪声参数时必须考虑到这一点。
g=imnoise(f,'gaussian',m,var)将均值M,方差为var的高斯噪声加到图像f上,默认值为均值是0,方差是0.01的噪声。
g=imnoise(f,'localvar',V)将均值为0,局部方差为V的高斯噪声添加到图像f上,其中V是与f大小相同的一个数组,它包含了每一个点的理想方差值。
g=imnoise(f,'localvar',image_intensity,var)将
均值为0的高斯噪声添加到图像f中,其中噪声的局部方差var是图像f的亮度值的函数。参量image_intensity和var是大小相同的向
量,plot(image_intensity,var)绘制出噪声方差和图像亮度的函数关系。向量image_intensity必须包含范围在
[0,1]内的归一化亮度值。
g=imnoise(f,'salt&pepper',d)用椒盐噪声污染图像f,其中d是噪声密度(即包括噪声值的图像区域的百分比)。因此,大约有d*numel(f)个像素受到影响。默认的噪声密度为0.05。
g=imnoise(f,'speckle',var)用方程g=f+n*f)将乘性噪声添加到图像f上,其中n是均值为0,方差为var的均匀分布的随机噪声,var的默认值是0.04。
g=imnoise(f,'poisson')从数据中生成泊松噪声,而不是将人工的噪声添加
到数据中,为了遵守泊松统计,unit8和unit16类图像的亮度必须和光子的数量相符合。当每个像素的光子数量大于65535时,就要使用双精度图像。亮度值在0到1之间变化,并且对应于光子的数量除以10e12。
1 均值滤渡器
均值滤波器是一种典型的线性去噪方法,因为其运算简单快速,同时又能够较为有效地去除高斯噪声。因而适用面较广。
许多滤除噪声方法都是在此基础上发展而来的。其缺点是严重破坏了图像的边缘,模糊了图像。
2 低通滤波器
低通滤波器,信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的;而在较高频段,感兴趣的信息常被噪声所淹没。因此。一个能降低高频成分幅度的滤波器就能减弱噪声的看的见的影响。这是一种频域处理法。在分析图像信号的频率特性时,一幅图像的边缘、跳跃部分以及颗粒噪声代表图像信号的高频分量,而大面积的背景区则代表低频分量。用滤渡的方法滤除其高频部分就能去掉噪声,使图像得到平滑。但同时,有用的高频成分也滤除了。因此这种处理是以牺牲清晰度为代价的。
3 中值滤波器
中值滤波器是一种消除噪声的非线性处理方法,它是由Tueky在1971年提出的。它的基本原理是把数字图像或数字序列中一点的值用该点的一个邻近各点值的中值代替。中值定义如下:对一个数字序列的元素进行排序,如果元素个数为奇数,则取排序后序列的中间值。如果序列元素个数为偶数,则取排序后序列的中间两个值的均值。
把一个点的特定长度或形状的领域称作窗口。在一维情况下,中值滤波器是一个含有奇数个像素的滑动窗口。窗口正中问那个像素的值用窗口内各像素值的中值代替。
该滤波器是一种典型的非线性处理方法。它的优势在对图像中脉冲噪声消除极为有效,且能够较好地保护图像边缘信息。
弱点是因为涉及大量排序运算,运算速度较慢,对图像的实时处理有影响。图像一般要传化成数字图像后才可以使用计算机对其进行各种处理。数字图像,是以数字的形式而存在的。利用MATLAB(矩阵实验室)进行处理时,我们简单地理解它为一定大小的数字矩阵。矩阵中的每个效字代表图像的一个像索点。由此可以知道,对数字图像的处理,实际上就是对一个数字矩阵的运算处理。
为了研究方便,我们的方法是人工的给原图像添加噪声·主要是不同强度的正态分布随机噪声和脉冲噪声。在MATLAB中,正态分布噪声是由randn函数实现的,而脉冲噪声,即平常所说的椒盐噪声,是由imnoise(Io,’saIt 8L pepper,i)实现的。其中Io是原图像矩阵,i取值。至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的区间,这样处理完之后,对图像的干扰就大到足以观察到效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)