-->

从随机像素图像插值(Image interpolation from random pixels)

2019-07-31 14:47发布

我想问一下关于单通道图像插值的问题。 单信道被选择只是为了简单起见,否则我工作的多通道图像。 假定有一个与纯黑色背景(像素强度0),其上有一些像素具有非零强度值的单个信道的图像。 我想申请一个插值算法,以填补插值从相邻的非零强度的像素来的图像的整个黑色区域。

你会推荐适用于该问题的一个光滑插值什么插值算法?

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

Answer 1:

常规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


Answer 2:

你最好的解决办法是使用gridfit 。 它旨在提高所有本地Matlab的功能,如TriScatteredInterp和的GridData。



Answer 3:

下面是基于使用径向基函数(在这种情况下的高斯)来构建用于与不同强度随机间隔开的点的内插的溶液。

本质上,这由点强度下降的高斯上的每个点,它的权重并总结的结果。

内插函数的锐度是通过所选择的高斯函数的标准偏差控制。

几点:

插值:

在看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]


Answer 4:

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

为了找到一个三角形区域内的像素的颜色,权重用于每个像素中,对于点A,B,和C,分别,(B C-A)/ A,(一个 CB)/ b和(一个* BC)/ C。 这确保了每个点的影响力恶化到零作为点变得更接近所述相对的边缘,从而使三角形之间的过渡是平滑的。

请记住,你可以使用任何类型的平均值,包括谐波和几何,不仅仅是算术,做计算(外观会发生变化,但其他类型的方式可能会更好反正)。



Answer 5:

任何插值看起来这个几个非零点非常糟糕,但你可以尝试卷积2-d过滤器的图像,如高斯核,看看你是否喜欢它。



文章来源: Image interpolation from random pixels