gpt4 book ai didi

python - 从 numpy 中的图像中提取缩略图

转载 作者:行者123 更新时间:2023-12-01 00:37:23 25 4
gpt4 key购买 nike

我有一个奇怪的问题,它涉及切片数组和提取小缩略图切口。我确实有一个解决方案,但它是一个笨重的 for 循环,在大图像上运行相当慢。

当前的解决方案如下所示:

import numpy as np

image = np.arange(0,10000,1).reshape(100,100) #create an image

cutouts = np.zeros((100,10,10)) #array to hold the thumbnails
l = 0

for i in range(0,10):
for j in range(0,10): #step a (10,10) box across the image + save results
cutouts[l,:,:] = image[(i*10):(i+1)*10, (j*10):(j+1)*10]
l = l+1

print(cutouts[0,:,:])

[[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[ 100. 101. 102. 103. 104. 105. 106. 107. 108. 109.]
[ 200. 201. 202. 203. 204. 205. 206. 207. 208. 209.]
[ 300. 301. 302. 303. 304. 305. 306. 307. 308. 309.]
[ 400. 401. 402. 403. 404. 405. 406. 407. 408. 409.]
[ 500. 501. 502. 503. 504. 505. 506. 507. 508. 509.]
[ 600. 601. 602. 603. 604. 605. 606. 607. 608. 609.]
[ 700. 701. 702. 703. 704. 705. 706. 707. 708. 709.]
[ 800. 801. 802. 803. 804. 805. 806. 807. 808. 809.]
[ 900. 901. 902. 903. 904. 905. 906. 907. 908. 909.]]

所以,就像我说的,这有效。但是,一旦我得到带有几个不同色带的非常大的图像(我从事天文学工作),它就会变得缓慢而笨重。在我的梦想世界中,我能够做这样的事情:

import numpy as np

image = np.arange(0,10000,1).reshape(100,100) #create an image

cutouts = image.reshape(100,10,10)

但是,它不会创建正确的缩略图,因为它会将整行读入第一个 (10,10) 数组,然后再移动到下一个数组:

print(cutouts[0,:,:])

[[ 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 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]]

所以,是的,这就是问题所在,我会生气吗?for循环是最好的方法,还是有一些聪明的方法可以分割图像数组,以便它生成我需要的缩略图。

干杯!

最佳答案

reshape 为4D,排列轴,再次 reshape -

H,W = 10,10 # height,width of thumbnail imgs
m,n = image.shape
cutouts = image.reshape(m//H,H,n//W,W).swapaxes(1,2).reshape(-1,H,W)

More info on the intuition behind it.

内置 scikit-image 的更紧凑版本:view_as_blocks -

from skimage.util.shape import view_as_blocks

cutouts = view_as_blocks(image,(H,W)).reshape(-1,H,W)

如果您对中间 4D 输出感到满意,它将是输入图像的 View ,因此在运行时几乎是免费的。让我们验证 View 部分 -

In [51]: np.shares_memory(image, image.reshape(m//H,H,n//W,W))
Out[51]: True

In [52]: np.shares_memory(image, view_as_blocks(image,(H,W)))
Out[52]: True

关于python - 从 numpy 中的图像中提取缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57630132/

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