随机像素的图像插值

8
我想就单通道图像插值问题向您提问。之所以选择单通道是为了简便,因为我实际在处理的是多个通道的图像。
假设有一张单通道图像,其背景为纯黑色(像素强度为0),上面有一些像素具有非零强度值。我想应用插值算法,从相邻的非零强度像素中获取插值,填充整个黑色区域。
对于这个问题,您推荐哪种平滑插值算法?
当然,我们知道非黑色像素的位置和其强度值,但这些位置有点随意(一行可能有10个像素,另一行可能只有8个)。
5个回答

6
常规的interp2在这里不适用,因为你的点不是位于规则间隔上(没有坐落在网格上)。 你可以尝试TriScatteredInterp或从文件交换中下载inpaint_nans。 以下是使用TriScatteredInterp的解决方案: enter image description here
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

4

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


1
inpaint_nans 在这里也可以使用。将零替换为 NaN 元素,然后将其输入 inpaint_nans。当需要插值的元素很少时,inpaint_nans 的优点在于它可能更有效率,因为它不需要适配整个图像,而只需从那些与空洞相邻的像素中插值。如果只提供了少量有效像素,则 gridfit 也同样好用。(声明:我是 gridfit 和 inpaint_nans 的作者。) - user85109

3

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

本质上,这会在每个点上放置一个高斯函数,通过点的强度对其进行加权并求和。

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

点如下:

Mathematica graphics

插值结果如下:

Mathematica graphics

在三维视图中查看: Mathematica graphics

使用较小的标准差: Mathematica graphics

代码如下:

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]

3
对于一个相对较少的点,理想的插值方法是创建一个三角形网格,仅使用每个区域的顶点来确定该区域内的像素,使用加权平均值来确定每个像素的颜色。
要找到三角形区域内像素的颜色,对于点A、B和C,分别使用权重(bc-A)/a、(ac-B)/b和(a*b-C)/c。这确保了每个点的影响力会随着其距离对边缘的接近而逐渐减弱,从而使三角形之间的过渡更加平滑。
请记住,您可以使用任何类型的平均值来进行计算,包括调和平均数和几何平均数,而不仅仅是算术平均数(外观将会改变,但是其他类型的平均数可能更好)。
图中标记三角形部分的图示如下:

我对Matlab不熟悉,所以不能确定,但安德烈的答案可能与我的完全相同,只是使用现有的库函数来实现。但如果是这样的话,他正在使用的插值器仅使用算术平均值,使用不同的插值器会有很大优势。 - AJMansfield

0

由于这些非零点太少,任何插值都会看起来很糟糕,但您可以尝试使用二维滤波器(如高斯核)对图像进行卷积,看看是否合适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接