很多时候需要把很多图片同时显示到一个画面中,现在分享两个方法,这里我恰好拿之前写的爬取网上图片保存到本地的爬虫模型爬一些图片作为素材Python 爬虫批量爬取网页图片保存到本地。
得到素材如下所示:
现在让这些图片同时显示。
subplot函数,这个方法比较简单,这个函数会把每个图片作为一个单独的部分自动整合到同一个画面中 ,使用方法如下:
import matplotlib.pyplot as plt
import numpy as np
N=4
M=8
#形成NxM大小的画布
for i in range(27):#有27张图片
path='pictures//变形金刚'+str(i)+'.jpg'
img = plt.imread(path)
plt.subplot(N,M,i+1)#表示第i张图片,下标只能从1开始,不能从0,
plt.imshow(img)
#下面两行是消除每张图片自己单独的横纵坐标,不然每张图片会有单独的横纵坐标,影响美观
plt.xticks([])
plt.yticks([])
plt.show()
运行结果如下:
上面这个代码的好处就是比较简洁,但是也有麻烦的,就是你缩放整个界面大小,每个图片之间的距离会发生变化,原因是每个图片还是一个单一的部分,下面介绍一个复杂的。
自定义,把所有图片合并成一张图片,当计算机读取图片时,图片本质就是一堆数字,这里需要修改下每张图片的尺寸,于是我自己用分治思想手写了个修改函数,点击这里查看Python手写修改图像尺寸大小的函数–利用二分+递归的原理。
完整代码如下:
import matplotlib.pyplot as plt
import numpy as np
def reshape_pictures1(data,N):#改变竖直方向大小
n,m,d=data.shape
X=np.zeros([N,m,d],dtype=int)
if n>N:
if n%N==0:#判断是否为倍数关系,如果是可以直接修改
d=int(n/N)
for i in range(N):
X[i]=data[i*d]
return X
else:
mid1=int(n/2)
mid2=int(N/2)
if 0<mid1:
X[0:mid2]=reshape_pictures1(data[0:mid1],mid2)#递归
if mid1<n:
X[mid2:N]=reshape_pictures1(data[mid1:n],N-mid2)#递归
return X
else:
if N%n==0:
d=int(N/n)
for i in range(n):
for j in range(d):
X[i*d+j]=data[i]
return X
else:
mid1=int(n/2)
mid2=int(N/2)
if 0<mid1:
X[0:mid2]=reshape_pictures1(data[0:mid1],mid2)#递归
if mid1<n:
X[mid2:N]=reshape_pictures1(data[mid1:n],N-mid2)#递归
return X
def reshape_pictures2(data,M):#改变水平方向大小
n,m,d=data.shape
X=np.zeros([n,M,d],dtype=int)
if m>M:
if m%M==0:
d=int(m/M)
for i in range(M):
X[:,i]=data[:,i*d]
return X
else:
mid1=int(m/2)
mid2=int(M/2)
if 0<mid1:
X[:,0:mid2]=reshape_pictures2(data[:,0:mid1],mid2)
if mid1<m:
X[:,mid2:M]=reshape_pictures2(data[:,mid1:m],M-mid2)
return X
else:
if M%m==0:
d=int(M/m)
for i in range(m):
for j in range(d):
X[:,i*d+j]=data[:,i]
return X
else:
mid1=int(m/2)
mid2=int(M/2)
if 0<mid1:
X[:,0:mid2]=reshape_pictures2(data[:,0:mid1],mid2)
if mid1<m:
X[:,mid2:M]=reshape_pictures2(data[:,mid1:m],M-mid2)
return X
def reshape_pictures(data,N,M):#最终的修改函数
X=reshape_pictures1(data,N)#修改竖直方向使得大小一致
X=reshape_pictures2(X,M)#修改水平方向使得大小一致
return X
#data表示所有图片合集,n和m分别表示每个图片要显示的大小,d表示图片之间的间隔单位
#row和col分别表示画面的长和宽
def show_pictures(data,n,m,d,rows,cols):
num=len(data)#得到图片数目
for i in range(num):#修改所有图片尺寸
data[i]=reshape_pictures(data[i],n,m)#修改尺寸为n x m
X=np.zeros([(n+d)*rows,(m+d)*cols,3],dtype=int)
page=0
for row in range(rows):
for col in range(cols):
if page>=num:
break
for i in range(n):
for j in range(m):
X[row*(n+d)+i][col*(m+d)+j]=data[page][i][j]
page+=1
plt.imshow(X)
plt.xticks([])#删除坐标刻度
plt.yticks([])#删除坐标刻度
plt.show()
if __name__ == '__main__':
data=[]
for i in range(27):#有27张图片
path='pictures//变形金刚'+str(i)+'.jpg'
img = plt.imread(path)#读取图片
reshape_pictures(img,400,400)
data.append(img)
show_pictures(data,100,100,1,4,8)#图片大小为100x100,图片间隔为1,整个界面内容为4x8=32张图片
希望我的分享对你的学习有所帮助,如果有问题请及时指出,谢谢~