【问题标题】:How to add and remove noise from an image如何在图像中添加和去除噪点
【发布时间】:2014-12-29 08:43:08
【问题描述】:

我想为 256x256 灰度图像添加高斯噪声,然后将其移除。我尝试使用以下代码,但我得到的只是一张只有噪声的图像。 是否可以完全消除图像中的噪点?如果不是,高斯噪声可以降低到什么程度?

 P =0;  %mean
 Q =0.01; %variance
 R = imnoise(L,'gaussian',P,Q); %L-image
 subplot(2,1,1);
 imshow(R);
 title('Gaussian Noise');

 U = conv2(double(R), ones(3)/9, 'same');
 U1=uint8(U);
 subplot(2,1,2);
 imshow(U1);
 title('Median Filtered Image');

我计划同时添加和去除泊松噪声和椒盐噪声。如果有过滤器也可以消除这些噪音,请建议我。 请帮忙。提前致谢。

【问题讨论】:

  • 我知道这并不能完全回答这个问题,至于另一种方法,您可以将未修改的原始图像存储到不同的变量或文件中吗?
  • @AlexB 是的,先生,它确实可以存储在不同的变量中。

标签: matlab image-processing gaussian noise


【解决方案1】:

从您的 cmets 的上下文和您提出的问题来看,您希望完全消除已经损坏的图像中的噪声。只有你知道噪声输入过程的脉冲响应/点扩散函数(PSF),你才能完全去除。了解 PSF 并以此进行噪声消除通常称为deconvolution。由于随机噪声过程的 PSF 在实践中鲜为人知,而且噪声是一个随机过程,因此几乎不可能完全去除所有噪声。确实存在噪声模型,但要知道破坏图像的噪声模型的确切参数非常困难(如果不是,则不可能......)。

您当然可以删除其中的大部分并且您不会恢复原始图像,但您可以通过标准的噪声过滤技术来减轻噪声。要去除高斯噪声,您可以简单地使用任何标准的低通滤波方法,例如average filtering 或高斯滤波。你也可以使用Wiener filtering,它是一个自适应过滤器。它分析图像的像素邻域并计算每个邻域的方差。如果方差很小,则执行更多的平滑处理,反之亦然。看看at this link for a good example


现在,在您发布的代码中,您选择使用conv2。我要指出的一件小事是您的过滤代码不进行中值过滤。您正在实施平均过滤器。如果要使用中值过滤,请改用medfilt2

在任何情况下,虽然conv2 通常适用于任何二维信号,但我建议您改用imfilter。它专门设计用于过滤图像(实际上是线性过滤......),如果您的计算机/处理器支持它的使用,它还利用英特尔的 IPP 库。我尝试使用标准cameraman.tif 图像在我的机器上运行您的代码(使用conv2),我得到的输出不是您的cmets 中提到的空白。我的猜测是,由于投射到uint8,您得到了一张空白图像。 L 最有可能转换为 double 精度图像,范围在 [0,1] 之间,当您简单地转换为 uint8 时,您只会得到强度为 0 或 1 的图像,这就是您不这样做的原因什么都看不见。尝试使用im2uint8 转换您的图像,这样您就可以将强度对比归一化为[0,255],而不是使用imshow 进行合适的显示。

但是,如果您使用imfilter,则无需转换类型,因为imfilter 将尊重输入图像的类型,并将对输出图像使用相同的类型。因此,让您的代码看起来像这样:

L = imread('cameraman.tif'); %// Load in image from MATLAB system path 
P =0;  %mean
Q =0.01; %variance
R = imnoise(L,'gaussian',P,Q); %L-image
subplot(2,1,1);
imshow(R);
title('Gaussian Noise');

U = imfilter(R, ones(3)/9, 'replicate');   %// Change - Use imfilter
subplot(2,1,2);
imshow(U);
title('Average Filtered Image'); %// Changed title to be correct

这是我得到的:


现在,为了回答您关于要过滤的不同类型噪声的问题,泊松噪声也可以通过低通滤波器(平均、高斯等)进行过滤。椒盐噪声最好用中值滤波来过滤。这是a great example on how median filtering works for salt and pepper noise

至于您可以消除噪音的“程度”,这完全取决于反复试验。您只需要继续使用不同的过滤器大小和参数过滤您的图像,直到您获得您认为感知良好的质量或使用所有试验中具有最高 PSNR 的图像。显然,您的图像越嘈杂,您就越需要制作过滤器,但您可能无法识别原始图像的外观。

这主要是一个反复试验的过程,因此您必须尝试使用​​这些参数,看看您会得到什么。


我希望这已经充分回答了您的问题。祝你好运!

【讨论】:

  • 先生,非常感谢您救命。我得到了结果。我将更改参数的值以获得更好的结果。
  • @Benoit_11 - Merci mon ami :) Vous savez qu'il neige à Toronto maintenant? C'est trop tôt pour moi!
  • 哦,这就是效果! À Québec on n'a malheureusement rien encore! :)
  • @Benoit_11 - 啊哈哈哈,我的朋友,你很快就会明白的:)
【解决方案2】:

根据您的评论,将 imread() 中未修改的原始图像数据保存到单独的数组变量中似乎是可以接受的,该变量在需要完全去除噪声的图像时使用。

【讨论】:

  • 先生,我需要从噪声图像中去除噪声并找到 PSNR。
  • 我以为您说可以将其存储在不同的变量中?
  • @AlexB - 我认为 OP 很困惑。我相信他们想尝试完全消除已经损坏的图像中的噪点,这是不可能的。
  • @rayryeng 是的,先生,这正是我需要做的。如果不是完全至少在某种程度上我想消除噪音。我得到的只是一张只有噪点的完整黑色图像。参考 SO 的一些帖子,我认为在去除噪声后,输出可能是带有一些噪声的原始图像。我无法找到我在代码中出错的地方。
  • 图片过滤时不要使用conv2。请改用imfilter。我正在写一个帖子。请给我一点时间。
猜你喜欢
  • 2013-08-08
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2023-04-10
  • 2016-12-05
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多