Display multiple images in one IPython Notebook cell?

后端 未结 10 1421
面向向阳花
面向向阳花 2020-12-12 12:26

If I have multiple images (loaded as NumPy arrays) how can I display the in one IPython Notebook cell?

I know that I can use plt.imshow(ima) to display

相关标签:
10条回答
  • 2020-12-12 12:52

    If you don't mind an additional dependency here is a two liner using scikit-image:

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

    Set multichannel=True for color images and multichannel=False for grayscale images.

    0 讨论(0)
  • 2020-12-12 13:02

    You can do it really fast and easy with IPyPlot:

    import ipyplot
    
    ipyplot.plot_images(images_array, max_images=20, img_width=150)
    

    You would get a plot similar to this:

    It's using IPython.display and HTML under the hood and it can take images in following formats:

    • string file paths
    • PIL.Image objects
    • numpy.ndarray objects representing images

    It would take just a few seconds to display a numpy array of 500 images

    0 讨论(0)
  • 2020-12-12 13:09

    Horizontal layout

    Short answer

    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)
    

    Long answer

    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)
    
    0 讨论(0)
  • 2020-12-12 13:10

    You can display multiple images in one IPython Notebook cell by using display and HTML functions. You need to create the set of html img tags as a string as follows

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

    See a example of use from http://nbviewer.ipython.org/github/PBrockmann/Dodecahedron

    You may need to refresh your browser (shift + load) to see new images if they have been changed from a previous cell.

    0 讨论(0)
  • 2020-12-12 13:10

    based on @ChaosPredictor answer

    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')
    

    then

    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)
    

    0 讨论(0)
  • 2020-12-12 13:11

    Short answer:

    call plt.figure() to create new figures if you want more than one in a cell:

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

    But to clarify the confusion with Image:

    IPython.display.Image is for displaying Image files, not array data. If you want to display numpy arrays with Image, you have to convert them to a file-format first (easiest with 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 notebook illustrating both approaches.

    0 讨论(0)
提交回复
热议问题