Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将函数应用于数组中的窗口(如筛选器)_Python_Arrays_Image_Numpy_Convolution - Fatal编程技术网

Python 将函数应用于数组中的窗口(如筛选器)

Python 将函数应用于数组中的窗口(如筛选器),python,arrays,image,numpy,convolution,Python,Arrays,Image,Numpy,Convolution,假设我将一个图像作为Numpy数组加载到Python中 我想在一个5x5窗口上运行一个函数,就像一个过滤器内核,但它不是真正的标准卷积。做这件事最有效的方法是什么 一个具体的例子-我有一个点的图像与相关的三维坐标。我想计算图像上5x5窗口的平均法向量。我想象的是: for each pixel in image: form an nxn window and extract a list of points fit a plane to the points calcul

假设我将一个图像作为Numpy数组加载到Python中

我想在一个5x5窗口上运行一个函数,就像一个过滤器内核,但它不是真正的标准卷积。做这件事最有效的方法是什么

一个具体的例子-我有一个点的图像与相关的三维坐标。我想计算图像上5x5窗口的平均法向量。我想象的是:

for each pixel in image:
    form an nxn window and extract a list of points
    fit a plane to the points
    calculate the normal
    associate this value with pixel (2,2) in the window

在Numpy中迭代数组通常是一种气味,所以我希望有更好的方法来实现它。

如果您有scipy,您可以使用

比如说,

import numpy as np
import scipy.ndimage as ndimage

img = np.arange(100, dtype='float').reshape(10,10)
print(img)
# [[  0.   1.   2.   3.   4.   5.   6.   7.   8.   9.]
#  [ 10.  11.  12.  13.  14.  15.  16.  17.  18.  19.]
#  [ 20.  21.  22.  23.  24.  25.  26.  27.  28.  29.]
#  [ 30.  31.  32.  33.  34.  35.  36.  37.  38.  39.]
#  [ 40.  41.  42.  43.  44.  45.  46.  47.  48.  49.]
#  [ 50.  51.  52.  53.  54.  55.  56.  57.  58.  59.]
#  [ 60.  61.  62.  63.  64.  65.  66.  67.  68.  69.]
#  [ 70.  71.  72.  73.  74.  75.  76.  77.  78.  79.]
#  [ 80.  81.  82.  83.  84.  85.  86.  87.  88.  89.]
#  [ 90.  91.  92.  93.  94.  95.  96.  97.  98.  99.]]

def test(x):
    return x.mean()

result = ndimage.generic_filter(img, test, size=(5,5))
print(result)
印刷品

[[  8.8   9.2  10.   11.   12.   13.   14.   15.   15.8  16.2]
 [ 12.8  13.2  14.   15.   16.   17.   18.   19.   19.8  20.2]
 [ 20.8  21.2  22.   23.   24.   25.   26.   27.   27.8  28.2]
 [ 30.8  31.2  32.   33.   34.   35.   36.   37.   37.8  38.2]
 [ 40.8  41.2  42.   43.   44.   45.   46.   47.   47.8  48.2]
 [ 50.8  51.2  52.   53.   54.   55.   56.   57.   57.8  58.2]
 [ 60.8  61.2  62.   63.   64.   65.   66.   67.   67.8  68.2]
 [ 70.8  71.2  72.   73.   74.   75.   76.   77.   77.8  78.2]
 [ 78.8  79.2  80.   81.   82.   83.   84.   85.   85.8  86.2]
 [ 82.8  83.2  84.   85.   86.   87.   88.   89.   89.8  90.2]]
请确保签出
mode
参数,以控制当窗口从边界边缘脱落时应传递给函数的值


请注意,这主要是一个方便的函数,用于组织计算。您仍然为每个窗口调用一次Python函数。这可能是天生的缓慢

将平面拟合到点听起来像是savitzky-golay过滤器,因此您应该能够轻松地对其进行矢量化。谢谢,我认为这基本上就是我想要的。这不是性能关键,但我不想让它整天运行!我将尝试并更新:)正如您所说,编程的便利性,但对于一些对我来说比性能更好的快速而肮脏的脚本。