用于Python图像处理的Blockproc函数

时间:2014-12-20 09:29:16

标签: python matlab image-processing

编辑:它是一张图片,所以建议的(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块调用该函数?那我就不会保持它的大小。

还有另一种更有效的方法吗?

2 个答案:

答案 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块。