【问题标题】:Removing negative values from the image从图像中删除负值
【发布时间】:2018-03-16 21:14:33
【问题描述】:

我有一张图像,在执行一定程度的预处理后,我观察到有大量的负值随机分布在图像中。

有没有什么方法可以通过 MATLAB 中的一些平均操作来去除那些负值而不是零?

要求:我的图像在应用该操作后不应高度失真。

【问题讨论】:

  • 请用您的图片发布一些代码
  • 我认为如果你有负值,那么你的图像已经失真了。
  • @Benoit_11 @AndrasDeak,图像没有失真,但是通过应用某些公式,我得到了负值。我还没有编写代码,但我相信filtering operation 会起作用。
  • 问题:您的图像可以计算负值是否合乎逻辑(您对图像应用什么类型的操作)?因为你说“我观察”,但我们不知道它是否应该发生
  • 发布引入负值的代码(请最小代码)和重现错误的示例图像。

标签: image matlab image-processing matrix


【解决方案1】:

首先:按照 cmets 的建议,尝试找出为什么你有负值。然后决定,如果你想要这些值。如果是:将图像重新缩放为[0,1]。如果您仍然想删除这些像素并将它们替换为某个平均值,正如您在问题中所建议的那样,这是一种方法:

这种噪音被称为“椒盐噪音”。这个有趣的名字的原因很明显,一旦你看到它的图像:图像上到处都是白色(像素 = 1)和黑色(像素 = 0)的点,看起来像盐粒和胡椒粒。

在您的情况下,如果我们假设负值为零,则图像中只会出现胡椒噪声。

为了解决这个问题,让我们准备一些数据:我们读取摄影师图像并将其转换为双精度(以允许负值)。然后我们随机反转所有像素的 1%,所以它们是负数。

im = im2double(imread('cameraman.tif'));
randmask = rand(size(im)) < 0.01;
distIm = im - 2*randmask.*im;

一种简单有效的过滤椒盐噪声的方法, 是使用中值滤波器(medfilt2),它 用定义邻域的中值替换图像中的每个像素,例如3x3。此过滤器是您对抗椒盐噪声的标准武器之一。

medfilt2(distIm);

您甚至可以选择小于零的像素,并使用roifilt2 函数仅对这些像素应用过滤器。这样你就不会触摸“正确”的像素:

filtIm = roifilt2(distIm, distIm<0, @medfilt2);

看起来没那么糟糕,是吗?但请注意:如果您有较大的负像素区域,那么这将无法正常工作,因为该邻域的中位数仍然是负数。

【讨论】:

  • 非常感谢这个有效的插图。再一次感谢你。我可以从中学到很多东西。
【解决方案2】:

如果您使用im2uint8(I) 将图像转换为uint8,您的图像将被缩放。

【讨论】:

    猜你喜欢
    • 2020-02-22
    • 2015-05-17
    • 2020-03-25
    • 2012-06-07
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2010-12-31
    • 2011-05-26
    相关资源
    最近更新 更多