3

假设我有一个 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 矩阵。

在此处输入图像描述

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

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

谢谢

4

2 回答 2

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“源兔子代码”的一个很好的包装器,这是一个功能齐全的重采样库。

于 2013-11-07T19:24:41.260 回答
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]])
于 2013-11-07T17:34:01.273 回答