web-dev-qa-db-ja.com

1つのIPython Notebookセルに複数の画像を表示しますか?

複数の画像(NumPy配列としてロード)がある場合、1つのIPython Notebookセルに表示するにはどうすればよいですか?

plt.imshow(ima)を使用してone image…を表示できることは知っていますが、一度に複数表示したいです。

私が試してみました:

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

しかし、私は壊れた画像リンクを取得します:

enter image description here

55
David Wolever

簡潔な答え:

セルに複数の図形が必要な場合は、plt.figure()を呼び出して新しい図形を作成します。

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

しかし、Imageとの混乱を明確にするために:

IPython.display.Imageは、イメージファイルを表示するためのものであり、配列データではありません。 Imageでnumpy配列を表示したい場合は、最初にそれらをファイル形式に変換する必要があります(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 ノートブック 両方のアプローチを示しています。

83
minrk

これは簡単で機能します:

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

水平レイアウト

Horizontal layout demonstration

簡潔な答え

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)
48
Michael

表示およびHTML関数を使用して、1つのIPython Notebookセルに複数の画像を表示できます。次のように、一連の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 +ロード)必要があります。

16
PBrockmann

enter image description here

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回答に基づく

2
ChaosPredictor

どういうわけかこの質問に関連していました(そして、私はそれを解決しようとしたときにこの答えに導かれたので)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)
1
Chriss Paul

追加の依存関係を気にしない場合は、 scikit-image を使用した2つのライナーがあります。

from skimage.util import montage
plt.imshow(montage(np.array(images), multichannel=True))

セットする multichannel=Trueカラー画像およびmultichannel=Falseグレースケール画像用。

1
Palmstrom

@ChaosPredictorの回答に基づいて

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

def showImagesMatrix(list_of_files, col=10, wSize=5, hSize=5, mypath='.'):
    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')

それから

from pathlib import Path
p = Path('.')
num_images = 30
list_of_image_paths = [str(x) for x in list(p.glob('../input/train/images/*'))[:num_images]]

showImagesMatrix(list_of_image_paths)

# or with named args
showImagesMatrix(list_of_image_paths, wSize=20, hSize=10, col=5)

matplotlib image grid

0
Harry Moreno

このスレッドの答えは私を助けました: Pythonでいくつかの画像を水平に組み合わせる

Matplotlibを使用する際の問題は、表示される画像の定義が非常に悪いことでした。そこで答えの1つを自分のニーズに合わせて調整しました。

次のコードは、jupyterノートブックで水平に連結された画像を表示します。必要に応じて、画像を保存するコードを含むコメント行に注意してください。

import numpy as np
import PIL
from IPython.display import display

list_im = ['Test1.jpg', 'Test2.jpg', 'Test3.jpg']
imgs    = [ PIL.Image.open(i) for i in list_im ]
# pick the image which is the smallest, and resize the others to match it (can be arbitrary image shape here)
min_shape = sorted( [(np.sum(i.size), i.size ) for i in imgs])[0][1]
imgs_comb = np.hstack( (np.asarray( i.resize(min_shape) ) for i in imgs ) )

# save that beautiful picture
imgs_comb = PIL.Image.fromarray( imgs_comb)
#imgs_comb.save( 'combo.jpg' )    

display(imgs_comb)
0
Victor Zuanazzi