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