Разложение и сбор задних изображений на куски питона 100х100 - PullRequest
0 голосов
/ 20 мая 2018

У меня есть массив изображений, и мне нужно разложить его на куски 100x100 и после манипуляций с ним собрать обратно в исходное изображение.Проблема: я не могу собрать вещи обратно, у меня есть что-то вроде этого,

, но реальное изображение 800x800

Мой код:

получить img как массив, удалить третье измерение

path_to_image = './la3.jpg'
image_array = plt.imread(path_to_image)
image_array = image_array[:, :, 0]

записать в новые части массива 100x100 (работает нормально):

main2_array = np.zeros(10000,)
for row in tqdm_notebook(range(0,8)):

    for col in range(0,8):
        main2_array = np.vstack((main2_array, image_array[0 + (100*row):100 + (100*row) ,0 + (100*col):100 + (100*col)].flatten()))

main2_array = np.delete(main2_array, main2_array[0] , axis=0  )

собрать части обратно(Не работает)

main_array = np.zeros(100,)

for p in tqdm_notebook(range(0,100)):
    for i in range(0,64):
        main_array = np.vstack((main_array, main2_array[0 + (10000*i) + (100*p): 100 + (10000*i) + (100*p)]))

main_array = np.delete(main_array, main_array[0] , axis=0  )     

После сбора кусков я получаю

image

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Немного поздно, но я считаю, что вопрос заслуживает более графического ответа.

Вам не нужны медленные циклы, вы можете сделать все это с помощью 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

Разложим изображение на 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

Теперь давайте сделаем некоторые манипуляции с плитками.

Очистить некоторую случайную плитку

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

Теперь для реконструкции вы можете просто изменить первоначальную форму

img = img.reshape(800, 800, 3)
plt.imshow(img)

enter image description here

0 голосов
/ 20 мая 2018

Поддельное изображение

x, y = 800,800
img_array = np.arange(x*y).reshape((x,y))

После вашей деконструкции main2_array.shape равно (64 10000);каждый ряд представляет собой сплющенный участок размером 100х100.Во время деконструкции вы пересекали изображение слева направо , сверху вниз и перемещали каждый патч ниже предыдущего патча.

Чтобы восстановить обратный процесс:

main_array = np.zeros((x,y))
for n, patch in enumerate(main2_array):
    patch = patch.reshape(100,100)
    # eight patches per row
    row, col = divmod(n, 8)
    row_offset, col_offset = row*100, col*100
    row_slice = slice(row_offset, 100 + row_offset)
    col_slice = slice(col_offset, 100 + col_offset)
    #print(np.all(patch == image_array[row_slice,col_slice]))
    main_array[row_slice, col_slice] = patch


>>> np.all(main_array == img_array)
True
>>> 

Или вы можете просто изменить свой путь назад к оригиналу

>>> b = main2_array.reshape(8,8,100,100)
>>> b[0,1].shape    # row zero column 1? 
(100, 100)
>>> np.all(b[0,1] == a[0:100, 100:200])
True
>>> 
>>> c = np.swapaxes(b, 1,2)
>>> c.shape
(8, 100, 8, 100)
>>> np.all(c[0,:,1,:] == a[0:100, 100:200])    # row zero column 1? 
True
>>> d = c.reshape(800,800)
>>> np.all(d==img_array)
True
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...