我想问一个关于单通道图像插值的问题。为简单起见选择单通道,否则我正在处理多通道图像。假设有一个具有纯黑色背景(像素强度 0)的单通道图像,其中有一些像素具有非零强度值。我想应用一种插值算法来用来自相邻非零强度像素的插值填充图像的整个黑色区域。
对于适用于此问题的平滑插值,您会推荐哪种插值算法?
作为输入,我们当然知道那些非黑色像素的位置及其强度。但是位置有点随机(一行可能是 10 个像素,另一行只有 8 个)。
我想问一个关于单通道图像插值的问题。为简单起见选择单通道,否则我正在处理多通道图像。假设有一个具有纯黑色背景(像素强度 0)的单通道图像,其中有一些像素具有非零强度值。我想应用一种插值算法来用来自相邻非零强度像素的插值填充图像的整个黑色区域。
对于适用于此问题的平滑插值,您会推荐哪种插值算法?
作为输入,我们当然知道那些非黑色像素的位置及其强度。但是位置有点随机(一行可能是 10 个像素,另一行只有 8 个)。
常规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
您最好的解决方案是使用gridfit。它旨在改进所有原生 Matlab 函数,如 TriScatteredInterp 和 griddata。
对于数量相对较少的点,插值它们的理想方法是创建一个三角形网格,仅使用每个区域的顶点来确定该区域内的像素,使用加权平均值来确定每个像素的颜色。
为了找到三角形区域内像素的颜色,每个像素使用的权重分别是 A、B 和 C,对于点 A、B 和 C,分别为 (b c-A)/a、(a c-B)/b 和 ( a*bC)/c。这确保了每个点的影响随着点越来越靠近相对边缘而恶化到零,因此三角形之间的过渡是平滑的。
请记住,您可以使用任何类型的平均值,包括谐波和几何,而不仅仅是算术,来进行计算(外观会改变,但其他类型的平均值可能会更好)。
这是一个基于使用径向基函数(在本例中为高斯函数)为具有不同强度的随机间隔点构建插值的解决方案。
本质上,这会在每个点上放置一个高斯分布,通过点强度对其进行加权并将结果求和。
插值函数的锐度可通过所选高斯函数的标准偏差来控制。
要点:
插值:
以 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]
对于这几个非零点,任何插值看起来都非常糟糕,但是您可以尝试使用二维滤波器(例如高斯核)对图像进行卷积,看看您是否喜欢它。