gpt4 book ai didi

python - 用于 Python 图像处理的类似 Blockproc 的函数

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:20 25 4
gpt4 key购买 nike

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

问题当然是我没有像上面那样对多个 block 应用 std。

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

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

最佳答案

如果窗口中没有重叠,您可以重新调整数据以满足您的需要:

求 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 .每个操作阵列的步幅以产生补丁/窗口。

关于python - 用于 Python 图像处理的类似 Blockproc 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27578855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com