图像中加入随机噪声的问题

panzjun 2005-05-10 08:05:16
大家好,为了生成一幅随机噪声图像,我首先把一幅图像变成全黑图像,然后在上面叠加随机点。我实验的是8位的图像,产生的随机噪声图像却是彩色图像,我想要的是灰度图像才对。不知道大家有没有遇到类似的问题。
我是用GDI+实现对图像像素的读取的,生成随机噪声的方法参考了VisualC++数字图像处理(何斌、马天予等)第十章中的加躁方法。有兴趣的朋友帮我看看什么地方出了问题。
加噪代码如下:
void CCAMdiImgProcDoc::OnRandomNoise()
{
Bitmap* b=m_pBitmap;
if(b->GetPixelFormat()==PixelFormat8bppIndexed)
{
Bitmap* b2;
int width=b->GetWidth();
int height=b->GetHeight();
Rect rect(0,0,width,height);
BitmapData bmData; b->LockBits(&rect,ImageLockModeRead|ImageLockModeWrite,PixelFormat8bppIndexed,&bmData);
byte* p=(byte*) (void*) bmData.Scan0;
int NoisePoint;
int stride=bmData.Stride;
srand((unsigned)time(NULL));//伪随机种子
int nOffset=stride-width;
for(int y=0;y<height;y++)
{
for(int x=0;x<width;x++)
{
NoisePoint=rand()/1024;
p[0]=NoisePoint;
p++;
}
p+=nOffset;

}
b->UnlockBits(&bmData);
m_pBitmap=b;
this->UpdateAllViews(NULL);
return;
}
}

如果对我的完整代码感兴趣的话,我可以把它发给大家。我的邮箱:panzjun123@163.com

...全文
787 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
panzjun 2005-05-28
  • 打赏
  • 举报
回复
TO:qqhuangshen(雨淋淋):
在我的代码中,我没有对调色板做任何的修改啊。这到底是怎么回事?
我用了gdi+,发现读像素之类的挺容易,但是没找到修改如调色板之类的代码读过,有没有在那里可以找到参考的代码阿?书籍也行啊,由相关经验的提示一下啊.
qqhuangshen 2005-05-24
  • 打赏
  • 举报
回复
是,我疏忽了,前者是由于类型问题,开始rand()/RAND_MAX已经把数变成0了,后面那个表达式是对的
NoisePoint=rand()/1024这个表达式,应该是不对的吧。至于调色版,很有可能是你写调色版的时候把RGB没有填成一样的,或者你的位图本身在每一级灰度的时候RGB就不一样,改过来就变成灰度的了
panzjun 2005-05-13
  • 打赏
  • 举报
回复
我刚才改了一下,NoisePoint=rand()/RAND_MAX*255要改成NoisePoint=(rand()*255)/RAND_MAX,就有随机数产生。
我想不通是NoisePoint=rand()/1024这个表达式是干什么的,qqhuangshen(雨淋淋)能解释一下么?
可是调色板的问题还是不解,能不能提供个例子程序??
panzjun 2005-05-13
  • 打赏
  • 举报
回复
TO:qqhuangshen(雨淋淋)
调色板数据怎么处理?有没有相关的例子给一下,这方面的问题我确实没有考虑到。
qqhuangshen 2005-05-12
  • 打赏
  • 举报
回复
为什么象素会是0,我想是因为你的这句话有问题NoisePoint=rand()/1024; p[0]=NoisePoint; p++;
rand()产生0-RAND_MAX之间的数。如果想产生随即噪声的话应该这样写:
NoisePoint=rand()/RAND_MAX*255.然后接着赋值
至于你产生的结果是RGB图像,因为你没有处理调色版数据,在存储过程中出现了问题
panzjun 2005-05-12
  • 打赏
  • 举报
回复
to: folk[飞龙在天]
我想取的是8位256色的图像像素,这样处理起来就不考虑rgb的关系了
PixelFormat8bppIndexed和PixelFormat24bppRGB 在我们处理像素的时候应该如何看待??
我总觉得这个地方有问题。
雷泽归妹 2005-05-11
  • 打赏
  • 举报
回复
随机产生R或G或B从0到255之间的某一个值,其它的两个与之相等,然后再输出,就是灰度像素了。
panzjun 2005-05-11
  • 打赏
  • 举报
回复
To puhuofeie(扑火飞蛾)
我用debug看了一下,随机数都是大于0的数。奇怪的是,虽然像素指针的地址一直在变化,但是指针的值一值为0,这是为什么?
方便的话,请给出邮箱吧^_^


酒红绿叶 2005-05-11
  • 打赏
  • 举报
回复
puhuofeie@hotmail.com
酒红绿叶 2005-05-10
  • 打赏
  • 举报
回复
估计一下问题。
全黑的象素值应该是0。
随机的话是否会产生负值?


不过我觉得可能性不大,
你应该debug遍历一下,看看象素值是否在0~255之间,
另外,你的bmp是否连续存储的?
再看调色板有没有问题。
panzjun 2005-05-10
  • 打赏
  • 举报
回复
确实
像素值全是0;你的建议——degug我会去做的。
bmp是否连续存储是什么意思?我的bmp图像是用画图程序打开空白图像然后凡色生成的。
如何看调色板的问题?我没有用到调色板啊
你有没有随机数产生的其他的方法??我怀疑是不是这里出了问题啊

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧