声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2644|回复: 7

[图像处理] 求助生成含噪图像的问题!

[复制链接]
发表于 2010-3-4 21:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
用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图像上去的呢?
希望得到各位大侠的帮助!
回复
分享到:

使用道具 举报

发表于 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 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 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);
这样噪声就完全掩盖了图像,只剩下雪花点了。请问问题出现在哪?是需要归一化之类的吗?
初来乍到,问题很多,感谢各位大侠的光临和指导。
发表于 2010-3-8 11:18 | 显示全部楼层
问题出现在噪声的方差太大,V是一个和I相同大小的数组(每个噪声点具有不同方差)。其实这样也行
  1. I = imread('lena.bmp');
  2. nI = imnoise(I,'gaussian',0,20);
  3. imshow(nI);
复制代码
发表于 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
  [a, code, classIn, classChanged, p3, p4] = 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 编辑 ]
未命名.jpg
 楼主| 发表于 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);
这样出来效果好很多,但我不太清楚程序是否存在问题。
发表于 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);
 楼主| 发表于 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将图像转成了双精度再相加。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-6 09:55 , Processed in 0.077954 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表