我只想用最简单的术语插入3D数据集.线性插值,最近邻,所有这些就足够了(这是从一些算法开始,所以不需要准确的估计).
在新的scipy版本中,像griddata这样的东西会很有用,但是目前我只有scipy 0.8.所以我有一个"立方体"(data[:,:,:],(NixNjxNk))数组,以及一个相同大小的标志(flags[:,:,:,],True或False)数组.我想插入数据元素的数据,其中flag的对应元素为False,例如使用数据中最近的有效数据点,或者"close by"点的某种线性组合.
数据集中至少有两个维度可能存在较大的间隙.除了使用kdtrees或类似编码完整的最近邻算法之外,我无法真正找到通用的N维最近邻插值器.
附上图像(test.tif).np.nan值是最白的区域.如何使用一些使用邻居值的间隙填充算法填充那些最白的区域?
import scipy.ndimage
data = ndimage.imread('test.tif')
Run Code Online (Sandbox Code Playgroud) 我用PIL创建一个图像:

我需要填补空白区域(描绘为黑色).我可以很容易地用静态颜色填充它,但我想做的是用附近的颜色填充像素.例如,边界之后的第一个像素可能是填充像素的高斯模糊.或者可能是Lumigraph,Gortler等人所述的推挽式算法..
我需要一些不太慢的东西,因为我必须在许多图像上运行它.我可以访问其他库,比如numpy,你可以假设我知道边界或外部区域或区域内的掩码.有关如何处理此问题的任何建议?
更新:
正如belisarius所建议的那样,opencv的inpaint方法是完美的.这里有一些使用opencv来实现我想要的python代码:
import Image, ImageDraw, cv
im = Image.open("u7XVL.png")
pix = im.load()
#create a mask of the background colors
# this is slow, but easy for example purposes
mask = Image.new('L', im.size)
maskdraw = ImageDraw.Draw(mask)
for x in range(im.size[0]):
for y in range(im.size[1]):
if pix[(x,y)] == (0,0,0):
maskdraw.point((x,y), 255)
#convert image and mask to opencv format
cv_im = cv.CreateImageHeader(im.size, cv.IPL_DEPTH_8U, 3)
cv.SetData(cv_im, im.tostring())
cv_mask = cv.CreateImageHeader(mask.size, cv.IPL_DEPTH_8U, 1)
cv.SetData(cv_mask, mask.tostring())
#do …Run Code Online (Sandbox Code Playgroud) 我有星系的照片.这些图像上有一些不需要的数据(如星星或飞机条纹)被屏蔽掉了.我不仅希望用一些平均值填充遮罩区域,而是根据周围数据对它们进行插值.我如何在python中做到这一点?
我们在SciPy.interpolate包中尝试了各种函数:RectBivariateSpline,interp2d,splrep/splev,map_coordinates,但它们似乎都在寻找现有像素之间的新像素,我们无法让它们填充数据中的任意"漏洞" .