python-numpy矩阵中的平均像素

时间:2013-11-07 16:25:40

标签: python arrays numpy matrix

假设我有一个5x5矩阵:

arr = np.arange(25).reshape((5,5))

array([[ 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]])

我希望通过对其进行平均来制作一个3x3矩阵。

enter image description here

这应该以这样的方式完成,即蓝色像素应该由包含的黑色像素组成,数字用蓝色像素内的区域加权。

这意味着第二个黑色像素的值(值1)3/5(?)应该添加到第一个蓝色像素,2/5到第二个蓝色像素

感谢

2 个答案:

答案 0 :(得分:2)

在我看来,你不知道自己真正想要什么。但你所描述的左上角玉米可以用scipy.signal.correlate扩展到整个数组,虽然它产生4x4输出,你的数学错误:

>>> import scipy.signal
>>> scipy.signal.correlate(np.arange(25).reshape(5, 5),
...                        [[1, 3/5], [3/5, 9/25]], 'valid') / 4
array([[  1.44,   2.08,   2.72,   3.36],
       [  4.64,   5.28,   5.92,   6.56],
       [  7.84,   8.48,   9.12,   9.76],
       [ 11.04,  11.68,  12.32,  12.96]])

答案 1 :(得分:2)

您似乎希望重新取样您的图片,以使其尺寸不同。如果是,那么您可以使用scipy.ndimage.zoom

import numpy as np
import scipy.ndimage

arr = np.arange(25).reshape((5,5))

resized_arr = scipy.ndimage.zoom(arr, 3. / 5)

print resized_arr.shape
print resized_arr

输出:

(3, 3)

[[ 0  2  4]
 [10 12 14]
 [20 22 24]]

您的想法是将函数拟合到图像中像素定义的2d曲面 - 在zoom的情况下,函数是参数样条曲线拟合。然后,一旦有适合表面的函数,就可以在任何网格点获得样本。

您还可以使用更复杂的功能来适应原始图像。查看scikits.samplerate以获取“源兔代码”的完美包装,这是一个功能齐全的重新采样库。