从图像中去除负值

Rom*_*oma 0 matlab image image-processing matrix

我有一个图像,并且在执行了一定程度的预处理之后,我发现图像中随机存在大量负值。

有什么方法可以通过MATLAB中的一些平均运算而不是零来去除这些负值吗?

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

hba*_*rts 5

首先,请按照注释中的建议尝试找出为什么您拥有负值。然后确定是否需要这些值。如果是:将图像缩放为[0,1]。如果您仍然要删除这些像素并将其平均替换,如您在问题中所建议的,则可以采用以下方法:

这种噪声称为“盐和胡椒噪声”。看到这个图像的名字后,这个名字很明显的原因很明显:图像上遍布白色(像素= 1)和黑色(像素= 0)点,看起来像盐和胡椒粒。

盐和胡椒粉噪音

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

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

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

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

medfilt2(distIm);
Run Code Online (Sandbox Code Playgroud)

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

filtIm = roifilt2(distIm, distIm<0, @medfilt2);
Run Code Online (Sandbox Code Playgroud)

结果

看起来还不错吗?但请注意:如果您有大面积的负像素区域,那么效果将不那么理想,因为该邻域的中值仍然为负。