3

私は 365 個の 2 次元numpy配列を 1 年中毎日使用しており、次のような画像を表示しています。

http://i50.tinypic.com/34i62gw.jpg

私はそれらをすべて 3D numpy 配列に積み重ねています。雲を表す値を持つピクセルを取り除きたい、過去 7 日間、または次の 7 日間 (前の 7 層、次の 7 層) を検索して、雲以外の値を見つけ、雲を置き換えたいそのピクセルの他の可能な値を持つ値 (対応するピクセルの他の日/レイヤーで経験された値)。

私はpythonが初めてで、少し迷っています。

何か案は?

ありがとう

4

3 に答える 3

3

基本的に、配列のフィルターを作成しようとしています。

最初に、値の配列が与えられたときに関数を作成する必要があります。中央の値は現在調べられている要素であり、それらの値の計算を返します。あなたの場合、関数は1次元配列を取ることを期待し、クラウドではない中間インデックスに最も近い要素を返します:

import numpy as np
from scipy.ndimage.filters import generic_filter

_cloud = -1

def findNearestNonCloud(elements):
    middleIndex = len(elements) / 2
    if elements[middleIndex] != _cloud:
        return elements[middleIndex] # middle value is not cloud

    nonCloudIndices, = np.where(elements != _cloud)
    if len(nonCloudIndices) == 0:
        return elements[middleIndex] # all values were cloud

    prevNonCloudIndex = np.where(nonCloudIndices < middleIndex, 
            nonCloudIndices, -1).max()
    nextNonCloudIndex = -np.where(nonCloudIndices > middleIndex, 
            -nonCloudIndices, 1).min()
    # -1 means no non-cloud index

    # pick index closest to middle index    
    if (abs(prevNonCloudIndex - middleIndex) 
            <= abs(nextNonCloudIndex - middleIndex)):
        return elements[prevNonCloudIndex]
    else:
        return elements[nextNonCloudIndex]

次に、関心のある要素にこの関数を適用する必要があります。これを行うには、特定の要素に関して関心のある他の要素を示すマスクが必要です。

from scipy.ndimage.filters import generic_filter

# creates 5 days worth of a 3x3 plot of land
input = np.ones((5, 3, 3)) * _cloud
input[0,:,:] = 10 # set first "image" to all be 10s
input[4,0,0] = 12 # uppper left corner of fourth image is set to 12
print "input data\n", input, "\n"

mask = (5, 1, 1)
# mask represents looking at the present day, 2 days in the future and 2 days in 
# the past for 5 days in total.

print "result\n", generic_filter(input, findNearestNonCloud, size=mask)
# second and third images should mirror first image, 
# except upper left corner of third image should be 12
于 2012-11-28T18:36:21.613 に答える
1

私はこれでそれを解決しました:

interpdata = []
j = 0
for i in stack:
    try:
        temp = np.where( stack[j] == 50, stack[j-1], modis[j] )
        temp = np.where( temp == 50, stack[j+1], temp )
        temp = np.where( temp == 50, stack[j-2], temp )
        temp = np.where( temp == 50, stack[j+2], temp )
        temp = np.where( temp == 50, stack[j-3], temp )
        temp = np.where( temp == 50, stack[j+3], temp ) 
        temp = np.where( temp == 50, stack[j-4], temp )
        temp = np.where( temp == 50, stack[j+4], temp )
    except IndexError:
        print 'IndexError Passed'       
        pass
    else:
        pass
    interpdata [j, :, :] = temp
    j = j + 1   
于 2012-12-31T12:35:48.593 に答える
0

次のようなことができると思います:

data = somehow_get_your_3d_data() #indexed as [day_of_year,y,x]
for i,dat in enumerate(data):
    weeks2 = data[max(i-7,i):min(i+7,len(data)), ... ]
    new_value = get_new_value(weeks2) #get value from weeks2 here somehow
    dat[dat == cloud_value] = new_value
于 2012-11-28T15:28:15.240 に答える