Image 基于随机像素的图像插值

Image 基于随机像素的图像插值,image,matlab,image-processing,numerical-analysis,Image,Matlab,Image Processing,Numerical Analysis,我想问一个关于单通道图像插值的问题。选择单通道只是为了简单,否则我将处理多通道图像。 假设有一个纯黑色背景(像素强度0)的单通道图像,其上有一些非零强度值的像素。我想应用一种插值算法,用相邻非零强度像素的插值值填充图像的整个黑色区域 对于适用于此问题的平滑插值,您建议使用哪种插值算法 作为输入,我们当然知道这些非黑色像素的位置及其强度。但位置有些随机(一行中可能有10个像素,另一行中只有8个) 使用这几个非零值点,任何插值看起来都很糟糕,但您可以尝试使用二维过滤器(如高斯核)卷积图像,看看您是否

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

对于适用于此问题的平滑插值,您建议使用哪种插值算法

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


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

常规的
interp2
在这里不起作用,因为您的点不是按固定间隔定位的(不是位于网格上)。 您可以尝试TriScatteredInterp或从文件交换下载
修复

以下是您使用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


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

为了找到三角形区域内像素的颜色,每个像素使用的权重分别是(bc-a)/a,(ac-B)/B和(a*B-C)/C。这可确保当点靠近对边时,每个点的影响退化为零,从而使三角形之间的过渡平滑

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


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

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

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

插值函数的锐度可通过所选高斯函数的标准偏差进行控制

要点:

内插法:

以三维方式查看:

标准偏差较小时:

守则:

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]

我不熟悉matlab,所以我不确定,但Andrey的答案实际上可能与我的答案相同,只是使用现有的库函数来实现。如果是这样的话,他使用的插值器只使用算术平均值,而使用另一个插值器会非常有利。修复在这里也会起作用。用NaN元素替换零,然后将其放入修复NaN中。当然,修复的优点是,如果要插值的元素很少,修复可能会更有效,因为它不需要拟合整个图像,而只需要从与孔相邻的像素中插值孔。如果只提供了几个有效像素,那么gridfit也同样好。(披露:我是gridfit和inpaint_nans的作者。)