如果我有多个图像(作为NumPy数组加载),如何在一个IPython Notebook单元中显示?
我知道我可以plt.imshow(ima)
用来显示一张图像……但是我想一次显示多个图像。
我试过了:
for ima in images:
display(Image(ima))
但是我只是得到了一个损坏的图像链接:
如果我有多个图像(作为NumPy数组加载),如何在一个IPython Notebook单元中显示?
我知道我可以plt.imshow(ima)
用来显示一张图像……但是我想一次显示多个图像。
我试过了:
for ima in images:
display(Image(ima))
但是我只是得到了一个损坏的图像链接:
display(Image(…))
吗?在这种情况下,图像看起来像一样src="data:np.array([…])"
。
Answers:
简短答案:
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)
说明这两种方法的笔记本。
%matplotlib inline
如果要显示图像,则需要这样做。
plt.figure()
在每个图像之前?
这更容易且有效:
from IPython.display import Image
from IPython.display import display
x = Image(filename='1.png')
y = Image(filename='2.png')
display(x, y)
display(*images)
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)
您可以使用显示和HTML函数在一个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 +加载)以查看新图像。
如果您不介意其他依赖项,则可以使用scikit-image来实现两个衬里:
from skimage.util import montage
plt.imshow(montage(np.array(images), multichannel=True))
设置multichannel=True
为彩色图像和multichannel=False
灰度图像。
以某种方式与此问题相关(并且由于在尝试解决该问题时将我定向到该答案),因此我可以通过在调用时简单地键入完整的文件路径来解决类似的问题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)
os.path.join
或pathlib.Path
组装路径。
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回答
基于@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)
该线程中的答案对我有所帮助:使用Python水平合并多个图像
使用matplotlib的问题是所显示图像的定义确实不好。我根据自己的需要调整了答案之一:
以下代码显示在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)
imshow
选项,为什么不结合使用它subplots
来创建图像数组?图像尺寸是否有很大差异?