如何使用Matplotlib/Seaborn绘制两张1000×1000图像的差异
绘制两张1000×1000图像的差异(Matplotlib实现)
我帮你整理了完整的可复现代码,专门解决你用Matplotlib绘制两张大尺寸修改后图像差异的需求,代码里已经对应了你提到的右上和左下子图布局,还做了大尺寸图像的渲染优化:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 设置绘图风格,让输出更美观 sns.set(style='dark') # 创建2×2子图布局,调整dpi避免大尺寸图像内存过载 fig, axes = plt.subplots(2, 2, figsize=(10, 10), dpi=100) fig.suptitle('StackOverflow Matplotlib colorbar demo', fontsize=16) # 生成第一张1000×1000随机图像数据 dat1 = np.random.randn(1000, 1000) # 生成修改后的第二张图像(模拟你对原图的修改:给右上角区域添加偏移) dat2 = dat1.copy() dat2[-300:, -300:] += 2.5 # 右上角300×300区域做修改,方便后续看差异 # 绘制子图:左上为原始图像 im1 = axes[0,0].imshow(dat1, cmap='viridis') axes[0,0].set_title('原始图像') axes[0,0].axis('off') # 关闭坐标轴,聚焦图像内容 # 你指定的右上角子图:展示修改后的图像2 im2 = axes[0,1].imshow(dat2, cmap='viridis') axes[0,1].set_title('修改后图像(右上)') axes[0,1].axis('off') # 你指定的左下角子图:再次展示修改后的图像2 axes[1,0].imshow(dat2, cmap='viridis') axes[1,0].set_title('修改后图像(左下)') axes[1,0].axis('off') # 计算并绘制两张图像的差异图 diff_data = np.abs(dat1 - dat2) # 归一化差异值到0-1范围,让差异区域更明显 diff_data = diff_data / diff_data.max() im_diff = axes[1,1].imshow(diff_data, cmap='coolwarm') axes[1,1].set_title('图像差异(亮区为修改处)') axes[1,1].axis('off') # 添加统一的颜色条,避免重复占用空间 fig.colorbar(im2, ax=axes.ravel().tolist(), shrink=0.8, location='bottom') # 调整布局,避免标题和子图重叠 plt.tight_layout(rect=[0, 0.03, 1, 0.95]) # 保存图像时记得加bbox_inches='tight',避免内容被截断 plt.savefig('image_diff_comparison.png', bbox_inches='tight') plt.show()
关键细节说明
- 大尺寸图像优化:设置
dpi=100并关闭坐标轴,减少内存占用和渲染时间,避免处理1000×1000图像时卡顿 - 差异计算:用
np.abs(dat1 - dat2)计算绝对差异,归一化后能更清晰地突出修改区域(亮部就是你修改过的地方) - 子图布局:严格对应你提到的右上和左下子图展示修改后的图像,同时补充了原始图和差异图做完整对比
- 颜色条处理:统一添加底部颜色条,避免每个子图单独加颜色条导致布局混乱
内容的提问来源于stack exchange,提问作者amyspark
相关产品推荐
相关产品推荐

