сохранение сетки разнородных изображений в Python - PullRequest
0 голосов
/ 12 ноября 2018

Как я могу использовать что-то вроде строки ниже для сохранения изображений на сетке 4x4 разнородных изображений?Представьте себе, что изображения идентифицируются по образцу [i], и я принимаю 16 различных значений.

scipy.misc.imsave(str(img_index) + '.png', sample[1])

Аналогично этому ответу, но для 16 различных изображений https://stackoverflow.com/a/42041135/2414957

Я не склонен кИспользуемый метод, пока он делает дело.Кроме того, я заинтересован в том, чтобы сохранять изображения, а не показывать их с помощью plt.show (), поскольку я использую удаленный сервер и имею дело с набором данных изображений CelebA, который является гигантским набором данных.Я просто хочу случайным образом выбрать 16 изображений из своей партии и сохранить результаты DCGAN и посмотреть, имеет ли это смысл или нет.

* В настоящее время я сохраняю изображения, как показано ниже:

batch_no = random.randint(0, 63)


scipy.misc.imsave('sample_gan_images/iter_%d_epoch_%d_sample_%d.png' %(itr, epoch, batch_no), sample[batch_no])

и здесь у меня 25 эпох и 2000 итераций, а размер пакета равен 64.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Я нашел это на github, а также поделился им:

import matplotlib.pyplot as plt

def merge_images(image_batch, size):
    h,w = image_batch.shape[1], image_batch.shape[2]
    c = image_batch.shape[3]
    img = np.zeros((int(h*size[0]), w*size[1], c))
    for idx, im in enumerate(image_batch):
        i = idx % size[1]
        j = idx // size[1]
        img[j*h:j*h+h, i*w:i*w+w,:] = im
    return img

im_merged = merge_images(sample, [8,8])
plt.imsave('sample_gan_images/im_merged.png', im_merged )

enter image description here

0 голосов
/ 12 ноября 2018

Лично я склонен использовать matplotlib.pyplot.subplots для подобных ситуаций. Если ваши изображения действительно разнородны, это может быть лучшим выбором, чем подход, основанный на конкатенации изображений, в ответе, с которым вы связаны.

import matplotlib.pyplot as plt
from scipy.misc import face

x = 4
y = 4

fig,axarr = plt.subplots(x,y)
ims = [face() for i in range(x*y)]

for ax,im in zip(axarr.ravel(), ims):
    ax.imshow(im)

fig.savefig('faces.png')

default plt.subplots behavior

Моя большая жалоба на subplots - это количество пробелов в полученном рисунке. Кроме того, для вашего приложения вы можете не хотеть тиков / кадров осей. Вот функция-обертка, которая решает эти проблемы:

import matplotlib.pyplot as plt

def savegrid(ims, rows=None, cols=None, fill=True, showax=False):
    if rows is None != cols is None:
        raise ValueError("Set either both rows and cols or neither.")

    if rows is None:
        rows = len(ims)
        cols = 1

    gridspec_kw = {'wspace': 0, 'hspace': 0} if fill else {}
    fig,axarr = plt.subplots(rows, cols, gridspec_kw=gridspec_kw)

    if fill:
        bleed = 0
        fig.subplots_adjust(left=bleed, bottom=bleed, right=(1 - bleed), top=(1 - bleed))

    for ax,im in zip(axarr.ravel(), ims):
        ax.imshow(im)
        if not showax:
            ax.set_axis_off()

    kwargs = {'pad_inches': .01} if fill else {}
    fig.savefig('faces.png', **kwargs)

Запуск savegrid(ims, 4, 4) на том же наборе изображений, который использовался ранее, дает:

output of savegrid wrapper

Если вы используете savegrid, если вы хотите, чтобы каждое отдельное изображение занимало меньше места, передайте ключевое слово fill=False arg. Если вы хотите показать тики / кадры осей, передайте showax=True.

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