Немного поздно, но я считаю, что вопрос заслуживает более графического ответа.
Вам не нужны медленные циклы, вы можете сделать все это с помощью numpy
изменения формы и необычной индексации.
Давайте начнем с образца изображения
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import skimage.transform
import skimage.data
img = skimage.data.chelsea()
# crop from (300, 451, 3) to (300, 300, 3)
img = img[:,80:380,:]
# resize to (800, 800)
img = skimage.transform.resize(img, (800,800))
plt.imshow(img)
![enter image description here](https://i.stack.imgur.com/eUNEb.png)
Разложим изображение на 64
100*100
плитки.Новая форма (8, 100, 8, 100, 3)
, и вы можете обращаться к отдельным изображениям с помощью img[i, :, j, :, ...]
.Не нужно хранить их в новом массиве, за исключением, может быть, более легкой читабельности.
img = img.reshape(8, 100, 8, 100, 3)
gs = mpl.gridspec.GridSpec(8,8)
for i in range(8):
for j in range(8):
ax = plt.subplot(gs[i,j])
ax.imshow(img[i,:,j,:,...])
![enter image description here](https://i.stack.imgur.com/Zwc1K.png)
Теперь давайте сделаем некоторые манипуляции с плитками.
Очистить некоторую случайную плитку
cells = np.random.randint(8, size=(20,2))
img[cells[:,0],:,cells[:,1],...] = 1
Перевернуть вверх дном и слева направо
img = img[:,::-1,:,::-1,...]
Добавить черные границы
img[:,:6,...] = 0
img[:,-6:,...] = 0
img[:,:,:,:6,...] = 0
img[:,:,:,-6:,...] = 0
И построить их
for i in range(8):
for j in range(8):
ax = plt.subplot(gs[i,j])
ax.imshow(img[i,:,j,:,...])
![enter image description here](https://i.stack.imgur.com/m4EHY.png)
Теперь для реконструкции вы можете просто изменить первоначальную форму
img = img.reshape(800, 800, 3)
plt.imshow(img)
![enter image description here](https://i.stack.imgur.com/QTszC.png)