Faster way to extract patches from images?

时间:2016-06-18 20:08:10

标签: python performance numpy image-processing

I am trying to extract patches of fixed size centered at some given position (x,y). The code is given below-

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])

Variable indices is the locations (indices.shape=(2,770)). x is the original image.

But this code is taking 25s seconds time. Can anyone tell me how to make this work faster? or any other alternatives if you can suggest it would be of great help.

2 个答案:

答案 0 :(得分:3)

假设您正在单独处理近边界索引,否则您将有不同形状的补丁,让我们自己建议使用broadcastinglinear-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]]])

答案 1 :(得分:1)

使用scikit-learn:

-regex

类似的功能可以在scikit-image中找到:view_as_windows