Отображать несколько изображений в одной ячейке ноутбука IPython?
Если у меня есть несколько изображений (загружаемых как массивы NumPy), как я могу отобразить в одной ячейке Notebook IPython?
Я знаю, что я могу использовать plt.imshow(ima)
для отображения одного изображения... но я хочу показывать более одного за раз.
Я пробовал:
for ima in images:
display(Image(ima))
Но я просто получаю сообщение об сломанном изображении:
![enter image description here]()
Ответы
Ответ 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