从灰度图像中删除异常值

时间:2013-04-04 23:30:53

标签: matlab image-processing kinect grayscale

问题

我有一个代表我想要清理的深度信息的图像序列。 有一些异常值(强度低于25的值,0-255范围内的值),我希望用一个可接受的替代方案填充(本地化到特定区域的平均值可能是一个很好的猜测)。

有人能看到一种简单的方法吗?我试图使用中值滤波器(滤波器大小为10)用NaN代替不需要的值,但它确实使情况恶化,相反通过用一般平均值代替它们来改善。

Basic trial

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

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

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

  1. 复制原始图片;
  2. 使用一般平均值填充无效像素;
  3. 使用光线10的圆盘使其模糊;
  4. 用我从第3点获得的值替换原始图像中的无效值。
  5. 运行大小为10的中值过滤器。
  6. 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 个答案:

答案 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,[]);

输出:

enter image description here

答案 2 :(得分:1)

这篇文章得到了回答,但仅仅是为了记录,在[1]中,作者基于自然形状的基本原理,即物体遵循二阶光滑度,他建议一种绘画方法,使曲率最小化一个 最小二乘意义。他还提供code。祝好运。

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

enter image description here