我有一个代表我想要清理的深度信息的图像序列。 有一些异常值(强度低于25的值,0-255范围内的值),我希望用一个可接受的替代方案填充(本地化到特定区域的平均值可能是一个很好的猜测)。
有人能看到一种简单的方法吗?我试图使用中值滤波器(滤波器大小为10)用NaN代替不需要的值,但它确实使情况恶化,相反通过用一般平均值代替它们来改善。
P.S。有人已经建议我使用快速小波重建,但我真的不知道从哪里开始......
我实施的解决方案(在阅读tmpearce建议的inpaint_nans
之前)是:
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});
答案 0 :(得分:7)
我建议MATLAB File Exchange
的{{3}}贡献 - 从您已经完成的开始,用NaN
替换异常值并使用该链接从那里开始。
从功能描述:
使用非NaN元素在2维阵列中插入NaN元素。能够 也推断,因为它不使用数据的三角测量。 Inpaint_nans提供了几种不同的插值方法, 它可以在准确性与速度和所需内存之间进行权衡。所有 目前在inpaint_nans中找到的方法基于稀疏线性 代数和PDE离散化。实质上,PDE被解决了 与所提供的信息一致。
Hooray可重用代码!
答案 1 :(得分: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,[]);
输出:
答案 2 :(得分:1)
这篇文章得到了回答,但仅仅是为了记录,在[1]中,作者基于自然形状的基本原理,即物体遵循二阶光滑度,他建议一种绘画方法,使曲率最小化一个 最小二乘意义。他还提供code。祝好运。
[1]Α分类级3-D对象数据库:让kineckto工作(ICCV)