gpt4 book ai didi

python - 从图像中提取补丁的更快方法?

转载 作者:太空狗 更新时间:2023-10-30 02:57:12 25 4
gpt4 key购买 nike

我正在尝试提取以某个给定位置 (x,y) 为中心的固定大小的色 block 。代码如下-

for i,j in zip(indices[0],indices[1]):
patches.append(
x[None,
i-int(np.floor(patch_size/2.0)):i+int(np.floor(patch_size/2.0))+1,
j-int(np.floor(patch_size/2.0)):j+int(np.floor(patch_size/2.0))+1])

变量 indices 是位置 (indices.shape=(2,770))。 x 是原始图像。

但是这段代码需要 25 秒的时间。谁能告诉我如何使这项工作更快?或任何其他替代方案(如果您可以建议)会有很大帮助。

最佳答案

假设您正在单独处理近边界索引,否则您将拥有不同形状的补丁,让我们建议自己使用矢量化方法 broadcasting连同一些关于 linear-indexing 的知识。下面发布的是一个实现这一理念的实现,为我们提供了这样的补丁的 3D 数组 -

m,n = x.shape
K = int(np.floor(patch_size/2.0))
R = np.arange(-K,K+1)
out = np.take(x,R[:,None]*n + R + (indices[0]*n+indices[1])[:,None,None])

让我们在最小输入情况下运行示例,输入图像 x(8,10) 并且索引使得所需的补丁不会超出输入图像的边界。然后,运行原始和建议的方法进行验证。我们开始吧-

1] 输入:

In [105]: # Inputs
...: x = np.random.randint(0,99,(8,10))
...: indices = np.array([[4,2,3],[6,3,7]])
...:

3] 带输出的原始方法:

In [106]: # Posted code in the question ...

In [107]: patches[0]
Out[107]:
array([[[92, 21, 84],
[10, 52, 36],
[ 5, 62, 61]]])

In [108]: patches[1]
Out[108]:
array([[[71, 76, 75],
[80, 32, 55],
[77, 62, 42]]])

In [109]: patches[2]
Out[109]:
array([[[16, 88, 31],
[21, 84, 51],
[52, 36, 3]]])

3] 建议的输出方法:

In [110]:  # Posted code in the solution earlier ...

In [111]: out
Out[111]:
array([[[92, 21, 84],
[10, 52, 36],
[ 5, 62, 61]],

[[71, 76, 75],
[80, 32, 55],
[77, 62, 42]],

[[16, 88, 31],
[21, 84, 51],
[52, 36, 3]]])

关于python - 从图像中提取补丁的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37901186/

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