Python ndimage generic_filter 的条件逻辑
Conditional logic with Python ndimage generic_filter
我正在尝试编写一个 python 函数来删除 2D 图像数据中的热像素。我正在尝试创建一个函数,该函数将采用二维数组中每个元素周围的邻居的平均值,并在其值超过其邻居的平均值特定数量(例如 3 西格玛)时有条件地覆盖该元素。这就是我所在的位置:
def myFunction(values):
if np.mean(values) + 3*np.std(values) < origin:
return np.mean(values)
footprint = np.array([[1,1,1],
[1,0,1],
[1,1,1]])
correctedData = ndimage.generic_filter(data, myFunction, footprint = footprint)
上面代码中的'origin'是示范性的。我知道这是不正确的,我只是想展示我正在尝试做的事情。有没有办法将当前元素的值传递给generic_function?
谢谢!
您的 footprint
没有将中心值传回您的函数。
我觉得用size
比较方便(相当于在footprint中使用all 1),然后在回调函数中处理一切。所以在你的情况下,我会提取回调函数中的中心值。像这样:
from scipy.ndimage import generic_filter
def despike(values):
centre = int(values.size / 2)
avg = np.mean([values[:centre], values[centre+1:]])
std = np.std([values[:centre], values[centre+1:]])
if avg + 3 * std < values[centre]:
return avg
else:
return values[centre]
让我们做一些假数据:
data = np.random.randint(0, 10, (5, 5))
data[2, 2] = 100
这会产生(例如):
array([[ 2, 8, 4, 2, 4],
[ 9, 4, 7, 6, 5],
[ 9, 9, 100, 7, 3],
[ 0, 1, 0, 8, 0],
[ 9, 9, 7, 6, 0]])
现在您可以应用过滤器:
correctedData = generic_filter(data, despike, size=3)
删除了我添加的尖峰:
array([[2, 8, 4, 2, 4],
[9, 4, 7, 6, 5],
[9, 9, 5, 7, 3],
[0, 1, 0, 8, 0],
[9, 9, 7, 6, 0]])
我正在尝试编写一个 python 函数来删除 2D 图像数据中的热像素。我正在尝试创建一个函数,该函数将采用二维数组中每个元素周围的邻居的平均值,并在其值超过其邻居的平均值特定数量(例如 3 西格玛)时有条件地覆盖该元素。这就是我所在的位置:
def myFunction(values):
if np.mean(values) + 3*np.std(values) < origin:
return np.mean(values)
footprint = np.array([[1,1,1],
[1,0,1],
[1,1,1]])
correctedData = ndimage.generic_filter(data, myFunction, footprint = footprint)
上面代码中的'origin'是示范性的。我知道这是不正确的,我只是想展示我正在尝试做的事情。有没有办法将当前元素的值传递给generic_function?
谢谢!
您的 footprint
没有将中心值传回您的函数。
我觉得用size
比较方便(相当于在footprint中使用all 1),然后在回调函数中处理一切。所以在你的情况下,我会提取回调函数中的中心值。像这样:
from scipy.ndimage import generic_filter
def despike(values):
centre = int(values.size / 2)
avg = np.mean([values[:centre], values[centre+1:]])
std = np.std([values[:centre], values[centre+1:]])
if avg + 3 * std < values[centre]:
return avg
else:
return values[centre]
让我们做一些假数据:
data = np.random.randint(0, 10, (5, 5))
data[2, 2] = 100
这会产生(例如):
array([[ 2, 8, 4, 2, 4],
[ 9, 4, 7, 6, 5],
[ 9, 9, 100, 7, 3],
[ 0, 1, 0, 8, 0],
[ 9, 9, 7, 6, 0]])
现在您可以应用过滤器:
correctedData = generic_filter(data, despike, size=3)
删除了我添加的尖峰:
array([[2, 8, 4, 2, 4],
[9, 4, 7, 6, 5],
[9, 9, 5, 7, 3],
[0, 1, 0, 8, 0],
[9, 9, 7, 6, 0]])