从灰度图像中去除异常值

5

问题

我有一个表示深度信息的图像序列,我想要清理一下。 其中有一些异常值(强度低于25,范围为0-255),我希望用可接受的替代方法来填充它们(在该特定区域局部平均值可能是一个好猜测)。

有人知道简单的方法吗?我尝试使用中值滤波器(滤波器大小为10),将不需要的值替换为NaN,但情况变得更糟了,而用通用平均值替换它们可以改善情况。

基本试验

P.S. 有人已经建议我使用快速小波重构,但我不知道从哪里开始......

已实现的解决方案(到目前为止)

我实现的解决方案(在阅读tmpearce建议的inpaint_nans之前)是:

  1. 复制原始图像;
  2. 使用通用平均值填充无效像素;
  3. 使用半径为10的圆形磁盘进行模糊处理;
  4. 将原始图像中的无效值替换为第3步得到的值。
  5. 运行大小为10的中值滤波器。
img2 = img;                                       
img2(img < .005) = mean(img(:));                  
H = fspecial('disk',10);                          
img3 = imfilter(img2,H,'symmetric');              
img4 = img;                                       
img4(img < .3) = img3(img < .3);                  
filterSize = 10;                                  
padopt = {'zeros','indexed','symmetric'};         
IMG = medfilt2(img4, [1 1]*filterSize, padopt{p});

Second trial

3个回答

7
我推荐从MATLAB文件交换中获取inpaint_nans贡献 - 像你已经做的一样,用NaN替换异常值,并使用链接进行下一步操作。
从函数描述中可以得知:
用非NaN元素插值2-d数组中的NaN元素。也可以外推,因为它不使用数据的三角剖分。inpaint_nans提供了几种不同的插值方法,这些方法在精度与速度和所需内存之间进行权衡。目前在inpaint_nans中找到的所有方法都是基于稀疏线性代数和PDE离散化的。本质上,PDE被解决以与提供的信息一致。
代码可重复使用,太棒了!

5
完全同意,只是晚了20秒。+1 - bla

4
使用名为 roifill 的函数。您需要对其进行一些处理。我不得不使用 imdilate,因为它会从边界插值。
代码:
testimage = imread('BAPz5.png');
testimage = double(rgb2gray(testimage));
testimage_filt = roifill(testimage,imdilate(testimage<100,true(4)));
figure(1);
subplot(1,2,1);
imshow(testimage,[]);
subplot(1,2,2);
imshow(testimage_filt,[]);

输出:

在此输入图片描述


1

这篇文章已经有答案了,但是为了记录,在[1]中,作者基于自然形态的基本原理,即物体遵循二阶平滑性,建议使用最小化曲率的修补方法来修复图像。他还提供了code。祝好运。

[1] 一个类别级别的三维对象数据库:把kineckto投入工作(ICCV)

enter image description here


请注意,仅链接答案不被鼓励,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,这些站点往往会随着时间的推移而变得陈旧)。请考虑在此处添加一个独立的摘要,将链接作为参考。 - kleopatra
这太棒了!感谢 Darkmoor 的提醒!总是很高兴能得到另一个人的意见,并有论据支持! - Atcold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接