Numpy inpaint nans插值和外推

时间:2014-02-11 00:14:01

标签: python image-processing numpy extrapolation

我正在使用numpy和scipy进行项目,我需要填写nanvalues。目前我使用scipy.interpolate.rbf,但它一直导致python崩溃,所以严重尝试/除了赢了甚至保存它。然而,在运行几次之后,似乎它可能会在中间数据被所有nans包围的情况下继续失败,例如岛屿。是否有一个更好的解决方案,不会一直崩溃?

顺便说一句,这是我需要推断的大量数据。有时多达一半的图像(70x70,灰度),但它并不需要完美。它是图像拼接程序的一部分,因此只要它与实际数据类似,它就可以工作。我试过最近的邻居来填补nans,但结果却太不一样了。

修改

它似乎总是失败的图像。隔离此图像允许它在崩溃之前传递图像ONCE。 Bad Image

我至少使用NumPy 1.8.0和SciPy 0.13.2。

2 个答案:

答案 0 :(得分:4)

使用SciPy的LinearNDInterpolator。如果所有图像的大小相同,则可以预先计算并重新使用网格坐标。

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

x = np.linspace(0, 1, 500)
y = x[:, None]
image = x + y

# Destroy some values
mask = np.random.random(image.shape) > 0.7
image[mask] = np.nan

valid_mask = ~np.isnan(image)
coords = np.array(np.nonzero(valid_mask)).T
values = image[valid_mask]

it = interpolate.LinearNDInterpolator(coords, values, fill_value=0)

filled = it(list(np.ndindex(image.shape))).reshape(image.shape)

f, (ax0, ax1) = plt.subplots(1, 2)

ax0.imshow(image, cmap='gray', interpolation='nearest')
ax0.set_title('Input image')
ax1.imshow(filled, cmap='gray', interpolation='nearest')
ax1.set_title('Interpolated data')
plt.show()

Interpolated missing values

答案 1 :(得分:2)

这证明足以满足我的需求。它实际上非常快并且产生合理的结果:

ipn_kernel = np.array([[1,1,1],[1,0,1],[1,1,1]]) # kernel for inpaint_nans

def inpaint_nans(im):
    nans = np.isnan(im)
    while np.sum(nans)>0:
        im[nans] = 0
        vNeighbors = scipy.signal.convolve2d((nans==False),ipn_kernel,mode='same',boundary='symm')
        im2 = scipy.signal.convolve2d(im,ipn_kernel,mode='same',boundary='symm')
        im2[vNeighbors>0] = im2[vNeighbors>0]/vNeighbors[vNeighbors>0]
        im2[vNeighbors==0] = np.nan
        im2[(nans==False)] = im[(nans==False)]
        im = im2
        nans = np.isnan(im)
    return im