yannai 发表于 2010-3-4 21:40

求助生成含噪图像的问题!

用MATLAB生成含噪图像,可用imnoise函数,不知是否还有别的方法?
imnoise的help中指出:
J = imnoise(I,type,parameters) Depending on type, you can specify additional parameters to imnoise. All numerical parameters are normalized; they correspond to operations with images with intensities ranging from 0 to 1.
参数是介于0到1之间的。
但是我在一篇文献上看到:
本文对各种灰度图在不同的噪声水平(σ =15, 20, 25, 30)下进行了仿真实验。我们以含噪LENA图(大小
为256×256,灰度级为256 级,σ = 20 )为例进行说明。
那他是如何添加的噪声到lena图像上去的呢?
希望得到各位大侠的帮助!

tuoniao992002 发表于 2010-3-6 15:30

回复 楼主 yannai 的帖子

就用这个imnoise函数啊,函数的语法是:
J = imnoise(I,type)
J = imnoise(I,type,parameters)
type是需要加入噪声的类型,高斯噪声、高斯白噪声、椒盐噪声等
这里只给出sigma的值
就是用的高斯白噪声,均值为0,方差分别是15,20,25,30,
具体使用就是:
I = imread('lena.bmp');
nI = imnoise(I,'localvar',15);
imshow(nI);
这样就添加了方差是15,均值为0的高斯白噪声了;
楼主看看imnoise函数的帮助啊,帮助里说的很清楚了

[ 本帖最后由 tuoniao992002 于 2010-3-6 15:34 编辑 ]

yannai 发表于 2010-3-8 09:56

回复 沙发 tuoniao992002 的帖子

感谢您的回复,我在看帮助的时候看得不够仔细。
但仍有一个问题就是,
I = imread('lena.bmp');
nI = imnoise(I,'localvar',15);
imshow(nI);
可是帮助里面是J = imnoise(I,'localvar',V) adds zero-mean, Gaussian white noise of local variance V to the image I. V is an array of the same size as I.
V不是一个数,而是一个和I相同大小的数组。
那我就
I = imread('lena.bmp');
V=20*ones(size(I));
XX=imnoise(I,'localvar',V);
imshow(XX);
这样噪声就完全掩盖了图像,只剩下雪花点了。请问问题出现在哪?是需要归一化之类的吗?
初来乍到,问题很多,感谢各位大侠的光临和指导。

xiezhh 发表于 2010-3-8 11:18

问题出现在噪声的方差太大,V是一个和I相同大小的数组(每个噪声点具有不同方差)。其实这样也行
I = imread('lena.bmp');
nI = imnoise(I,'gaussian',0,20);
imshow(nI);

tuoniao992002 发表于 2010-3-8 15:03

回复 板凳 yannai 的帖子

nI = imnoise(I,'localvar',15);
这行代码是错误的,很抱歉,不过你的回答中的代码是正确的。
因为我以前都是用椒盐噪声,这个噪声没用过
我试了试这个函数,按照4楼的方法也是错误的,
不过却发现了你的问题:
>> nI = imnoise(i,'localvar',0,15);
??? Error using ==> imnoise>ParseInputs
For 'localvar' noise, IMAGE_INTENSITY must be a
nonnegative real vector less than or equal to 1.

Error in ==> imnoise at 85
= ParseInputs(varargin{:});
说的是对于‘localvar’噪声,参数必须是小于等于1的非负实数
V=0.5*ones(size(I));
XX=imnoise(I,'localvar',V);
imshow(XX);
这样就行了
至于你说你在文章里看到别人的方差是15、20等,这个我没看那篇文章,也不 太清楚

[ 本帖最后由 tuoniao992002 于 2010-3-8 15:04 编辑 ]

yannai 发表于 2010-3-8 15:09

回复 地板 xiezhh 的帖子

感谢您的回复。
这个方差不是我自己定的,而是看到文献上面是这样定的。它出来的含噪图像就不像我这种都是雪花点、噪声太大。
但我这样实现:
I=imread('lena.bmp');
init=2055615866;
rand('seed',init);
noise=20*randn(size(I));   
In=I+noise;
imshow(In);
这样出来效果好很多,但我不太清楚程序是否存在问题。

xiezhh 发表于 2010-3-8 16:44

回复 6楼 yannai 的帖子

我看了一下imnoise函数的源代码,发现它把图像数据先转换成取值介于0和1之间的双精度数据,然后加入噪声,这就造成了你所说的现象,你6楼的代码没有将I转为双精度数据,所以效果就好得多。其实你6楼的代码存在一些问题,I是8位无符号整型,而noise是双精度数据,它们不能加吧。以football.jpg为例,我觉得可以这样
I = imread('football.jpg');
noise = sqrt(20)*randn(size(I));   
In = I + uint8(noise);
imshow(In);

yannai 发表于 2010-3-8 16:59

回复 7楼 xiezhh 的帖子

感谢您的回复,确实上面我的程序有误。
X=imread('lena.bmp');
I=double(X)+1;
init=2055615866;
rand('seed',init);
noise=20*randn(size(I));   
In=I+noise;
imshow(In);
我用I=double(X)+1将图像转成了双精度再相加。
页: [1]
查看完整版本: 求助生成含噪图像的问题!