使用Matplotlib显示图像时,如何在不保存图像的情况下去除白边
解决Matplotlib显示图像时的白边问题(无需保存图像)
嘿,我看你是想通过Matplotlib绘制图像后提取无白边的numpy数组对吧?当前代码里的白边是因为默认的布局边距、坐标轴空间还有标题padding导致的,不用保存图像也能搞定,直接调整你的绘图流程就行:
方法1:让Axes完全填满Figure(最稳妥的方式)
直接创建和图像尺寸完全匹配的Figure,再让Axes彻底覆盖它,把所有多余元素都关掉:
import cv2 import numpy as np import matplotlib.pyplot as plt # 加载图像并转换颜色空间(OpenCV默认BGR,Matplotlib用RGB) image = cv2.imread('lenna.png') image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) title = "foo" # 根据图像实际像素和dpi计算Figure尺寸,避免拉伸 dpi = plt.rcParams['figure.dpi'] height, width = image.shape[:2] fig = plt.figure(figsize=(width / dpi, height / dpi)) # 创建完全覆盖Figure的Axes,无任何边距 ax = fig.add_axes([0, 0, 1, 1]) ax.clear() ax.axis('off') # 彻底关闭坐标轴 ax.set_title(title, pad=0) # 设置标题时取消内边距,避免白边 # 绘制图像,用nearest插值保证像素准确 ax.imshow(image_rgb.astype(np.uint8), interpolation="nearest") # 提取无白边的numpy数组 fig.canvas.draw() # 注意:fromstring已废弃,改用frombuffer + tostring_rgb I = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) I = I.reshape(height, width, 3)
方法2:在现有代码基础上调整布局
如果不想重构代码,直接在绘制图像后添加布局调整命令也能去除白边:
# 你的原有代码执行到ax.imshow()之后,添加这两行 plt.tight_layout(pad=0) ax.figure.subplots_adjust(left=0, right=1, top=1, bottom=0) # 再执行绘制和数组提取 ax.figure.canvas.draw() w, h = ax.figure.get_size_inches() * ax.figure.get_dpi() I = np.frombuffer(ax.figure.canvas.tostring_rgb(), dtype=np.uint8) I = I.reshape(int(h), int(w), 3)
几个关键提醒:
- 一定要记得把OpenCV的BGR格式转成RGB,不然Matplotlib显示的颜色会偏色
- 如果不需要标题,直接删掉
ax.set_title(),能彻底避免标题带来的顶部白边 - 别再用
np.fromstring了,这个方法已经被官方废弃,改用np.frombuffer更稳妥
这样处理后,你提取到的I就是完全没有白边的原始图像数组啦。
内容的提问来源于stack exchange,提问作者Kev1n91
相关产品推荐
相关产品推荐

