使用Python合并图片:将4张10x10图拼成20x20四象限图
解决方法:像素级拼接20x20图片
嘿,我懂你的需求啦——你要的不是用matplotlib展示四个子图,而是真正把4张10x10的图片从像素层面合并成一张20x20的单图,对吧?之前用subplots的方式只是创建了四个子图布局的画布,并不是真正的像素拼接,所以才不符合预期。
下面给你两种靠谱的实现方式,重点推荐第一种,这才是最直接的像素合并方法:
方法一:用Numpy直接拼接(最推荐)
图片本质就是数值数组,我们可以用Numpy的数组拼接函数直接把它们按四象限拼起来:
import numpy as np from PIL import Image # 用于图片读取/保存,也可以用matplotlib的imread # 先把图片转成Numpy数组(假设image1~image4已经是数组,或者用下面的方式读取) # image1 = np.array(Image.open("image1.png")) # image2 = np.array(Image.open("image2.png")) # image3 = np.array(Image.open("image3.png")) # image4 = np.array(Image.open("image4.png")) # 第一步:横向拼接每行的两张图(第一行是左上+右上,第二行是左下+右下) top_row = np.hstack((image1, image3)) bottom_row = np.hstack((image2, image4)) # 第二步:纵向拼接两行,得到20x20的合并图 combined_image = np.vstack((top_row, bottom_row)) # 验证尺寸:输出应该是(20,20)(灰度图)或者(20,20,3)(RGB图) print(combined_image.shape) # 保存成图片 Image.fromarray(combined_image).save("combined_20x20.png") # 或者用matplotlib显示(记得关掉坐标轴,看起来更像单图) from matplotlib import pyplot as plt plt.imshow(combined_image) plt.axis('off') plt.show()
方法二:用Matplotlib导出无间距的合并图(适合快速预览)
如果你一定要用Matplotlib来实现,可以通过调整子图间距、去掉边框等方式,让子图无缝拼接,再导出成图片:
from matplotlib import pyplot as plt # 创建2x2子图,设置画布尺寸和dpi,保证导出后是20x20像素 f, ax = plt.subplots(2, 2, figsize=(2, 2), dpi=10) plt.subplots_adjust(wspace=0, hspace=0) # 去掉子图之间的所有间距 # 逐个添加图片,同时去掉坐标轴 ax[0,0].imshow(image1) ax[0,0].axis('off') ax[1,0].imshow(image2) ax[1,0].axis('off') ax[0,1].imshow(image3) ax[0,1].axis('off') ax[1,1].imshow(image4) ax[1,1].axis('off') # 导出成20x20像素的图片,去掉多余边距 plt.savefig("combined_20x20.png", bbox_inches='tight', pad_inches=0, dpi=10) plt.show()
不过这种方式本质还是子图布局的导出,不如Numpy拼接来得直接和准确,更适合快速预览场景。
内容的提问来源于stack exchange,提问作者cohsta
相关产品推荐
相关产品推荐

