出于空间分析的目的,我试图设置一个过滤器,对于给定邻域中的像素,给出该像素在其邻域中的百分位数(由结构元素定义)。
以下是我迄今为止最好的镜头:
import numpy as np
import scipy.ndimage as ndimage
import scipy.stats as sp
def get_percentile(values, radius=3):
# Retrieve central pixel and neighbours values
cur_value = values[4]
other_values = np.delete(values, 4)
return sp.percentileofscore(other_values, cur_value)/100
def percentiles(image):
# definition of the neighbourhood (structuring element)
footprint = np.array([[1,1,1],
[1,1,1],
[1,1,1]])
# Using generic_filter to apply sequentially a my own user-defined
# function (`get_percentile`) in the filter
results = ndimage.generic_filter(
image,
get_percentile,
footprint=footprint,
mode='constant',
cval=np.nan)
return results
# Pick dimensions for a dummy example
dims = [12,15]
# Generate dummy example
df = np.random.randn(np.product(dims)).reshape(dims[0], dims[1])
percentiles(df)
它有点工作,但是: 1. 我确信代码不是真正的最佳,并且可以运行得更快 2. 我邻居的维度是硬编码的。我想要的是footprint
根据这个过滤器从它的邻居中更好地识别我正在应用过滤器()的中心像素。