2015-08-28 6 views
1

У меня есть массив numpy, который выглядит так. Raw dataИнтерполяция массива numpy с максимальным расстоянием интерполяции

Я хочу интерполировать между точками данных, чтобы заполнить некоторые меньшие отверстия в данных. Скажем, в этом примере я хочу интерполировать максимум на 2 пикселя. Тогда я ожидал бы что-то похожее на это. Expected result

До сих пор я пытался несколько методов интерполяции, как:

from scipy.interpolate import LinearNDInterpolator 
valid_mask = ~np.isnan(raw) 
coords = np.array(np.nonzero(valid_mask)).T 
values = raw[valid_mask] 
it = LinearNDInterpolator(coords, values) 
interpolated = it(list(np.ndindex(raw.shape))).reshape(raw.shape) 

, которые приводят к результату. Interpolated

Этот подход не сохраняет кластеры в данных, которые я мог бы легко преодолеть путем кластеризации заранее, а затем добавить результаты. Но что более важно, он интерполируется на больших расстояниях в кластерах, которые имеют форму вогнутой формы.

Может ли кто-нибудь указать мне метод интерполяции, который использовал какой-то порог расстояния?

Для тестирования я включил данные выборки, которые я использовал, чтобы объяснить мою проблему:

raw = np.array([[ 0., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 1., 0., 0., 3., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 5., 4., 4., 4., 4., 4., 5.], 
    [ 0., 5., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0.], 
    [ 0., 0., 1., 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0., 0., 0., 0.]]) 

raw[raw==0]=np.nan 

ответ

3

Вы могли бы сделать binary_closing (например, из skimage.morphology или scipy.ndimage.morphology), чтобы замаскировать свой окончательный вывод.

from skimage import morphology 
close_mask = morphology.binary_closing(valid_mask, morphology.square(3)) 
interpolated[:] = np.where(close_mask, interpolated, np.nan) 

Результаты в:

array([[ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan], 
     [ nan, 1. , 1.6667, 2.3333, 3. ,  nan,  nan,  nan], 
     [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan], 
     [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan], 
     [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan], 
     [ nan, 5. , 4. , 4. , 4. , 4.  , 4. ,  nan], 
     [ nan, 5. , 3. ,  nan,  nan,  nan,  nan,  nan], 
     [ nan,  nan, 2. ,  nan,  nan,  nan,  nan,  nan], 
     [ nan,  nan, 1. ,  nan,  nan,  nan,  nan,  nan], 
     [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan]]) 

Изменение размера ядра и формы, чтобы получить именно то, что вы хотите; несколько доступных или вы можете сделать свой собственный. Очевидно, что это не очень эффективно, потому что он выполняет всю интерполяцию, но только сохраняет нужные части. Я не уверен, как ограничить, где расчет делается в первую очередь.

Кроме того, он, кажется, убивает границу (см. Строку 5). Я предполагаю, что это можно исправить.

Смежные вопросы