5

问题

我有一个图像序列,表示我想清理的深度信息。有一些异常值(强度低于 25 的值,在 0-255 范围内),我想用可接受的替代值填充它们(定位于该特定区域的平均值可能是一个很好的猜测)。

有人能看到一个简单的方法吗?我尝试使用中值过滤器(过滤器大小为 10)用 NaN 替换不想要的值,但它确实使情况恶化,而是通过用一般平均值替换它们来改善情况。

基础试用

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

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

我实施的解决方案(在阅读tmpearceinpaint_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});

二审

4

3 回答 3

7

我推荐inpaint_nans的贡献,MATLAB File Exchange就像你已经完成的那样,将异常值替换为NaN并使用链接从那里开始。

从函数的描述:

使用非 NaN 元素在二维数组中插入 NaN 元素。也可以推断,因为它不使用数据的三角剖分。Inpaint_nans 提供了几种不同的插值方法,在精度与速度和所需内存之间进行权衡。目前在 inpaint_nans 中发现的所有方法都基于稀疏线性代数和 PDE 离散化。本质上,求解 PDE 以与提供的信息一致。

可重用代码万岁!

于 2013-04-04T23:56:52.557 回答
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,[]);

输出:

在此处输入图像描述

于 2013-04-05T00:35:27.787 回答
1

该帖子已回答但仅作记录,在[1]中,作者基于自然形状的基本原理,即对象遵循二阶平滑度,他提出了一种最小化曲率的in-painting方法-方感。他还提供代码。祝你好运。

[1] 类别级 3-D 对象数据库:使 kineckto 工作 (ICCV)

在此处输入图像描述

于 2013-12-25T13:25:36.770 回答