【问题标题】:Image interpolation from random pixels随机像素的图像插值
【发布时间】:2012-09-07 21:35:51
【问题描述】:

我想问一个关于单通道图像插值的问题。为简单起见选择单通道,否则我正在处理多通道图像。 假设有一个具有纯黑色背景(像素强度 0)的单通道图像,其中有一些像素具有非零强度值。我想应用一种插值算法来用来自相邻非零强度像素的插值填充图像的整个黑色区域。

对于适用于该问题的平滑插值,您会推荐哪种插值算法?

作为输入,我们当然知道那些非黑色像素的位置及其强度。但位置有点随机(一行可能是 10 个像素,另一行只有 8 个像素)。

【问题讨论】:

    标签: image matlab image-processing numerical-analysis


    【解决方案1】:

    使用这几个非零点,任何插值都会看起来很糟糕,但您可以尝试使用二维滤波器(例如高斯核)对图像进行卷积,看看您是否喜欢它。

    【讨论】:

      【解决方案2】:

      常规的interp2 在这里不起作用,因为您的点不是定期定位的(不是坐在网格上)。 您可以尝试TriScatteredInterp 或从文件交换处下载inpaint_nans

      这是您使用TriScatteredInterp的解决方案:

      function solveStackOverflowProblem()
          im = imread('http://i.stack.imgur.com/lMaYR.png');
          im = im(:,:,2);
          [i,j] = find(im);
          y = j; x = i;
          indexes = sub2ind(size(im),i,j);
          interpolator = TriScatteredInterp(x,y,double(im(indexes)));
      
          [Y,X] = meshgrid( 1:size(im,2),1:size(im,1));
          reconstructedImage = interpolator(X,Y);
      
          figure;imshow(reconstructedImage/255)
      end
      

      【讨论】:

        【解决方案3】:

        对于数量相对较少的点,对它们进行插值的理想方法是创建一个三角形网格,仅使用每个区域的顶点来确定该区域内的像素,使用加权平均值来确定每个像素的颜色。

        要找到三角形区域内像素的颜色,用于每个像素的权重分别为,对于点 A、B 和 C,(bcA)/a, (acB)/b 和 (a*bC)/c。这样可以确保每个点的影响随着点越来越靠近对边而恶化到零,因此三角形之间的过渡是平滑的。

        请记住,您可以使用任何类型的平均值,包括谐波和几何,而不仅仅是算术,来进行计算(外观会改变,但其他类型的平均值可能会更好)。

        【讨论】:

        • 我对matlab不熟悉,所以不确定,但安德烈的答案可能和我的其实一样,只是使用现有的库函数来完成。但是,如果是这样,那么他使用的插值器仅使用算术平均值,而使用不同的插值器会非常有利。
        【解决方案4】:

        您最好的解决方案是使用gridfit。它旨在改进所有原生 Matlab 函数,如 TriScatteredInterp 和 griddata。

        【讨论】:

        • inpaint_nans 也可以在这里使用。用 NaN 元素替换零,然后将其放入 inpaint_nans。优点当然是,如果要插入的元素很少,inpaint_nans 可能会更有效,因为它不需要适合整个图像,而只需从与它们相邻的像素中插入孔。如果只提供了几个有效像素,那么 gridfit 也一样好。 (披露:我是 gridfit 和 inpaint_nans 的作者。)
        【解决方案5】:

        这是一个基于使用径向基函数(在本例中为高斯函数)为具有不同强度的随机间隔点构建插值的解决方案。

        本质上,这会在每个点上放置一个高斯,按点强度对其进行加权并对结果求和。

        插值函数的锐度可通过所选高斯函数的标准差来控制。

        要点:

        插值:

        以 3D 形式查看:

        使用较小的标准差:

        代码:

        pts = Table[{{RandomReal[{0, 200}], RandomReal[{0, 200}]}, 
           RandomReal[]}, {20}]
        
        dists = Function[points, 
          Plus @@ ((PDF[
                  MultinormalDistribution[#, 200 IdentityMatrix[2]], {x, 
                   y}] & /@ points[[All, 1]] ) points[[All, 2]])/Length@points]
        
        DensityPlot[dists[pts], {x, 0, 200}, {y, 0, 200}, PlotPoints -> 100]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-10
          • 2020-10-03
          • 2018-10-10
          • 1970-01-01
          • 2022-07-10
          • 1970-01-01
          • 2019-09-17
          • 1970-01-01
          相关资源
          最近更新 更多