解决seaborn matplotlib保存图像后用cv2读取时标签被裁剪问题
问题解决:seaborn/matplotlib保存图片后用OpenCV读取出现内容裁剪
核心原因
裁剪问题来自两个环节:
- 图片保存时,matplotlib默认的保存边界不会自动覆盖标题、坐标轴标签等画布外部元素,导致这部分内容被截断在保存的图片外
- 读取后展示时,OpenCV默认返回BGR通道顺序的图片,直接用matplotlib展示会出现颜色偏差,同时matplotlib默认展示的坐标轴也会占用区域、干扰原图展示
- 原代码中预先定义的
fig = plt.Figure()实例未被实际使用,FacetGrid会自动创建独立画布,冗余的定义可能干扰布局参数
解决方法
1 调整图片保存逻辑
删除冗余的画布定义,保存时添加边距自动调整参数:
import pandas as pd import numpy as np import cv2 import seaborn as sns import matplotlib.pyplot as plt by_c = None g = sns.FacetGrid(pd.DataFrame(np.random.random(10)*150, columns=['col']), col=None, row=None, height=3.5, aspect=1) g.map_dataframe(sns.histplot, x='col') plt.title('col'+' - '+str(by_c)+'-', fontsize=12) plt.xlabel('Value') plt.ylabel('Frequency') # bbox_inches='tight'自动计算边界纳入所有元素,pad_inches自定义留白大小 plt.savefig('temp.png', bbox_inches='tight', pad_inches=0.2) plt.show()
2 调整读取展示逻辑
转换图片通道顺序,关闭展示用的坐标轴:
im = cv2.imread('temp.png') # 转换BGR通道为matplotlib适配的RGB通道 im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) # 关闭坐标轴避免占用展示区域 plt.axis('off') plt.imshow(im_rgb) plt.show()
补充说明
如果仍有轻微裁剪,可适当调大pad_inches的数值,也可在调用savefig前先执行plt.tight_layout()做前置布局优化。
内容的提问来源于stack exchange,提问作者Naga kiran
相关产品推荐
相关产品推荐

