编辑:它是一张图片,所以建议的(How can I efficiently process a numpy array in blocks similar to Matlab's blkproc (blockproc) function)并不适合我
我有以下matlab代码
fun = @(block_struct) ...
std2(block_struct.data) * ones(size(block_struct.data));
B=blockproc(im2double(Icorrected), [4 4], fun);
我想重新制作我的代码,但这次是在Python中。我已经安装了Scikit,我试图像这样解决它
b = np.std(a, axis = 2)
问题当然是我没有将std应用于多个块,就像上面一样。
我该怎么做这样的事情?启动一个循环并尝试为每个X * X块调用该函数?那我就不会保持它的大小。
还有另一种更有效的方法吗?
答案 0 :(得分:1)
如果 windows 中没有重叠,您可以重新整形数据以满足您的需求:
找出9x9阵列的3x3窗口的平均值。
import numpy as np
>>> a
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, 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]])
找到新形状
>>> window_size = (3,3)
>>> tuple(np.array(a.shape) / window_size) + window_size
(3, 3, 3, 3)
>>> b = a.reshape(3,3,3,3)
找到第一和第三轴的平均值。
>>> b.mean(axis = (1,3))
array([[ 10., 13., 16.],
[ 37., 40., 43.],
[ 64., 67., 70.]])
>>>
4x4阵列的2x2窗口:
>>> a = np.arange(16).reshape((4,4))
>>> window_size = (2,2)
>>> tuple(np.array(a.shape) / window_size) + window_size
(2, 2, 2, 2)
>>> b = a.reshape(2,2,2,2)
>>> b.mean(axis = (1,3))
array([[ 2.5, 4.5],
[ 10.5, 12.5]])
>>>
如果窗口大小不均匀地分成数组大小,它将无法工作。在这种情况下,您需要在窗口中进行一些重叠,或者如果您只是想要重叠numpy.lib.stride_tricks.as_strided
是可行的方法 - 可以在Efficient Overlapping Windows with Numpy找到通用的N-D函数
2d数组的另一个选项是sklearn.feature_extraction.image.extract_patches_2d,而对于ndarray' s - sklearn.feature_extraction.image.extract_patches。每个人都操纵数组的步幅来产生补丁/窗口。
答案 1 :(得分:0)
我做了以下
io.use_plugin('pil', 'imread')
a = io.imread('C:\Users\Dimitrios\Desktop\polimesa\\arizona.jpg')
B = np.zeros((len(a)/2 +1, len(a[0])/2 +1))
for i in xrange(0, len(a), 2):
for j in xrange(0, len(a[0]), 2):
x.append(a[i][j])
if i+1 < len(a):
x.append(a[i+1][j])
if j+1 < len(a[0]):
x.append(a[i][j+1])
if i+1 < len(a) and j+1 < len(a[0]):
x.append(a[i+1][j+1])
B[i/2][j/2] = np.std(x)
x[:] = []
我认为这是对的。迭代图像2并获取每个邻居节点,将它们添加到列表并计算标准
编辑*后来编辑了4x4块。