Подтвердить что ты не робот

Отображать несколько изображений в одной ячейке ноутбука IPython?

Если у меня есть несколько изображений (загружаемых как массивы NumPy), как я могу отобразить в одной ячейке Notebook IPython?

Я знаю, что я могу использовать plt.imshow(ima) для отображения одного изображения... но я хочу показывать более одного за раз.

Я пробовал:

 for ima in images:
     display(Image(ima))

Но я просто получаю сообщение об сломанном изображении:

enter image description here

4b9b3361

Ответ 1

Короткий ответ:

вызовите plt.figure(), чтобы создать новые цифры, если вы хотите больше одного в ячейке:

for ima in images:
    plt.figure()
    plt.imshow(ima)

Но для выяснения путаницы с Image:

IPython.display.Image предназначен для отображения файлов изображений, а не данных массива. Если вы хотите отображать массивы numpy с помощью Image, вам сначала нужно преобразовать их в формат файла (проще всего с PIL):

from io import BytesIO
import PIL
from IPython.display import display, Image

def display_img_array(ima):
    im = PIL.Image.fromarray(ima)
    bio = BytesIO()
    im.save(bio, format='png')
    display(Image(bio.getvalue(), format='png'))

for ima in images:
    display_img_array(ima)

A блокнот, иллюстрирующий оба подхода.

Ответ 2

Это проще и работает:

from IPython.display import Image
from IPython.display import display
x = Image(filename='1.png') 
y = Image(filename='2.png') 
display(x, y)

Ответ 3

Горизонтальная компоновка

Горизонтальная демонстрация макета

Короткий ответ

plt.figure(figsize=(20,10))
columns = 5
for i, image in enumerate(images):
    plt.subplot(len(images) / columns + 1, columns, i + 1)
    plt.imshow(image)

Длинный ответ

import glob
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline

images = []
for img_path in glob.glob('images/*.jpg'):
    images.append(mpimg.imread(img_path))

plt.figure(figsize=(20,10))
columns = 5
for i, image in enumerate(images):
    plt.subplot(len(images) / columns + 1, columns, i + 1)
    plt.imshow(image)

Ответ 4

Вы можете отображать несколько изображений в одной ячейке ноутбука IPython с помощью функций отображения и HTML. Вам нужно создать набор тегов html img в виде строки, как показано ниже.

from IPython.display import Image, HTML, display
from glob import glob
imagesList=''.join( ["<img style='width: 120px; margin: 0px; float: left; border: 1px solid black;' src='%s' />" % str(s) 
                 for s in sorted(glob('yourimage*.png')) ])
display(HTML(imagesList))

См. пример использования http://nbviewer.ipython.org/github/PBrockmann/Dodecahedron

Вам может потребоваться обновить браузер (shift + load), чтобы увидеть новые изображения, если они были изменен из предыдущей ячейки.

Ответ 5

Как-то связанный с этим вопросом (и поскольку я был направлен на этот ответ, когда я пытался его решить), я смог решить подобную проблему, просто набрав полный путь к файлу при вызове Image(). В моем случае мне пришлось выбирать случайное изображение из разных путей папки, хранящихся в списке your_folder, и отображать их.

import random, os 
for i in range(len(your_folder)):
   ra1 = "../"+your_folder[i]+"/"+random.choice(os.listdir(your_folder[i]))
   image = Image(ra1)
   display(image)

Ответ 6

введите описание изображения здесь

from matplotlib.pyplot import figure, imshow, axis
from matplotlib.image import imread

mypath='.'
hSize = 5
wSize = 5
col = 4

def showImagesMatrix(list_of_files, col=10):
    fig = figure( figsize=(wSize, hSize))
    number_of_files = len(list_of_files)
    row = number_of_files/col
    if (number_of_files%col != 0):
        row += 1
    for i in range(number_of_files):
        a=fig.add_subplot(row,col,i+1)
        image = imread(mypath+'/'+list_of_files[i])
        imshow(image,cmap='Greys_r')
        axis('off')

showImagesMatrix(listOfImages,col)

на основе ответа @Michael