2011-08-08 2 views
3

일부 이미지 처리를 수행하기 위해 마스크 처리 된 배열을 사용하고 있습니다. 마스크는 이미지를 둘러싸는 NoData 픽셀을 처리 할 수있는 위치에 있습니다 (데이터 픽셀이 아닌 원점을 사용하여 투영 된 이미지를 매핑하기 때문에 필요한 경계선).numpy.interp & masked arrays

다음 코드 블록을 사용하여 이미지에 가우스 스트레치를 수행 할 수 있습니다.

def gaussian_stretch(input_array, array_mean, array_standard_deviation, number_of_bins, n): 
    shape = input_array.shape 
    input_array = input_array.flatten() 
    #define a gaussian distribution, get binned GDF histogram 
    array_standard_deviation *= n 
    gdf = numpy.random.normal(array_mean, array_standard_deviation, 10000) 
    hist, bins = numpy.histogram(gdf, number_of_bins, normed=True) 
    cdf = hist.cumsum() 
    cdf = 256 * cdf/cdf[-1] 
    #interpolate and reshape 
    input_array = numpy.interp(input_array,bins[:-1],cdf) 
    input_array = input_array.reshape(shape) 
    return input_array 

이미지에 NoData 테두리가 없으면 예상대로 스트레치가 작동합니다. 마스크가있는 이미지에서 마스크는 무시됩니다. 이 예상되는 동작입니까? 마스크되지 않은 데이터 만 처리하는 방법에 대한 아이디어가 있습니까?

input_array.compressed()를 사용해 보았습니다. 그러나 마스크되지 않은 값만의 1D 배열을 반환합니다. 배열 사이의 크기 불일치로 인해 numpy.interp를 사용하면 예상대로 실패합니다.

마지막으로, numpy.random.normal을 사용한다고해서 항상 완벽한 가우스 분포가 반환되는 것은 아니며 알고리즘의 나머지 부분이 작동하면 오류 한계가 추가된다는 것을 알고 있습니다.

답변

3

먼저 input_array의 마스크를 가져 와서 결과 배열에 적용하고 scipy.stats.norm을 사용하여 정규 분포의 cdf를 계산하거나 scipy.special.erf()를 사용하여 cdf를 계산할 수 있습니다. 정상 분포의 cdf 수식을 사용하여 :

import scipy.stats as stats  
def gaussian_stretch2(input_array, array_mean, array_standard_deviation, n): 
    mask = input_array.mask 
    n = stats.norm(array_mean, array_standard_deviation*n) 
    return numpy.ma.array(n.cdf(input_array), mask=mask)