【问题标题】:Blockproc like function for Python image processing用于 Python 图像处理的类似 Blockproc 的函数
【发布时间】:2015-02-19 03:29:28
【问题描述】:

编辑:这是一张图片,所以建议的 (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) 

问题当然是我没有对多个块应用标准,就像上面一样。

我怎么能做这样的事情?开始一个循环并尝试为每个 X*X 块调用函数?那我就不会保持原来的大小了。

还有其他更有效的方法吗?

【问题讨论】:

  • stackoverflow.com/questions/5073767/… 的重复项? (这有帮助吗?)
  • @AndyHayden 这是我检查过的东西,但考虑到所要求的时间以及如何引入像 Scikit 这样的库,我希望有更清楚的东西。
  • @AndyHayden 指出的as_strided 解决方案是您最好的选择。这是另一个使用as_stridedstackoverflow.com/a/26848312/2823755
  • @wwii 我的列表已经采用 B[:, :] 部分之前显示的格式。尽管我无法理解其余的解决方案,但还是选择了我自己的平庸之作。

标签: python matlab image-processing


【解决方案1】:

我做了以下

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 并获取每个相邻节点,将它们添加到列表中并计算标准。

edit* 稍后编辑为 4x4 块。

【讨论】:

    【解决方案2】:

    如果 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 函数


    二维数组的另一个选项是 sklearn.feature_extraction.image.extract_patches_2d 和 ndarray 的 - sklearn.feature_extraction.image.extract_patches。每个都操纵数组的步幅来生成补丁/窗口。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      相关资源
      最近更新 更多