Список теряет форму при добавлении массива NumPy - PullRequest
0 голосов
/ 01 октября 2019

Я использую PIL для загрузки изображений, а затем преобразую их в массивы NumPy. Затем мне нужно создать новое изображение на основе списка изображений, поэтому я добавляю все массивы в список, а затем преобразую список обратно в массив, чтобы форма для списка изображений имела 4 измерения (n_images, height,ширина, rgb_channels). Я использую этот код:

def gallery(array, ncols=4):

    nindex, height, width, intensity = array.shape
    nrows = nindex // ncols
    # want result.shape = (height*nrows, width*ncols, intensity)

    result = (array.reshape(nrows, ncols, height, width, intensity)
              .swapaxes(1,2)
              .reshape(height*nrows, width*ncols, intensity))
    return result

def make_array(dim_x):
        for i in range(dim_x):
           print('series',i) 
           series = []
           for j in range(TIME_STEP-1):
              print('photo',j)
              aux = np.asarray(Image.open(dirpath+'/images/pre_images /series_{0}_Xquakemap_{1}.jpg'.format(i,j)).convert('RGB'))
              print(np.shape(aux))
              series.append(aux)
              print(np.shape(series))

        im = Image.fromarray(gallery(np.array(series)))
        im.save(dirpath+'/images/gallery/series_{0}_Xquakemap.jpg'.format(i))
        im_shape = (im.size)

make_array(n_photos)
# n_photos is the total of photos in the dirpath

Проблема в том, что, когда произошло добавление в список series, форма изображения (добавлен массив NumPy) теряется. Поэтому при попытке изменить форму массива в функции gallery возникает проблема. Вот фрагмент вывода для приведенного выше кода:

...

series 2
photo 0
(585, 619, 3)
(1, 585, 619, 3)
photo 1
(587, 621, 3)
(2,)
photo 2
(587, 621, 3)
(3,)
photo 3
(587, 621, 3)
(4,)
...

Как видно, при добавлении второй фотографии список теряет размерность. Это странно, потому что код работает первые две итерации, которые используют практически одинаковые изображения. Я пытался использовать np.stack(), но ошибка преобладает.

Я также нахожу эту проблему на Github, но я думаю, что это не относится к этому случаю, даже если поведение аналогичное.

Работа в Ubuntu 18, Python 3.7.3 и Numpy 1.16.2.

edit: добавлено то, что @kwinkunks спросил

1 Ответ

0 голосов
/ 01 октября 2019

Во второй функции, я думаю, вам нужно переместиться на series = [] до внешнего цикла.

Вот мое воспроизведение проблемы:

import numpy as np
from PIL import Image

TIME_STEP = 3

def gallery(array, ncols=4):
    """Stitch images together."""
    nindex, height, width, intensity = array.shape
    nrows = nindex // ncols
    result = array.reshape(nrows, ncols, height, width, intensity)
    result = result.swapaxes(1,2)
    result = result.reshape(height*nrows, width*ncols, intensity)
    return result

def make_array(dim_x):
    """Make an image from a list of arrays."""
    series = []  # <<<<<<<<<<< This is the line you need to check.
    for i in range(dim_x):
        for j in range(TIME_STEP - 1):
            aux = np.ones((100, 100, 3)) * np.random.randint(0, 256, 3)
            series.append(aux.astype(np.uint8))

    im = Image.fromarray(gallery(np.array(series)))

    return im

make_array(4)

В результате:

The output: lots of squares

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...