如何将Matplotlib Figure转换为无白边的NumPy数组?
我懂你要的是完全剔除白边、只保留图像内容的NumPy数组,你的现有代码已经走对方向了,问题主要出在画布尺寸匹配和窗口渲染带来的额外边距上。试试下面的调整方案,绝对能解决你的问题:
修改后的完整代码
import matplotlib.pyplot as plt import numpy as np # 先获取你的输入图像尺寸(假设myimage是已加载的图像数组) height, width = myimage.shape[:2] # 创建与图像像素尺寸完全匹配的figure # dpi设为1,figsize用图像的宽高(单位:像素),这样figure实际像素就是(width, height) fig = plt.figure(frameon=False, figsize=(width, height), dpi=1) # 创建完全覆盖figure的axes,无任何偏移 ax = plt.Axes(fig, [0., 0., 1., 1.]) ax.set_axis_off() # 彻底关闭坐标轴 # 让axes的范围和图像完全对齐(注意Matplotlib的y轴方向和图像相反) ax.set_xlim(0, width) ax.set_ylim(height, 0) fig.add_axes(ax) ax.imshow(myimage) # 直接渲染画布,不要用plt.show()!它会触发窗口渲染,引入额外白边 fig.canvas.draw() # 转换为NumPy数组(用frombuffer替代已弃用的fromstring) data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) data = data.reshape(height, width, 3) plt.close(fig)
关键调整点说明
- 画布尺寸严格匹配:通过
figsize=(width, height)和dpi=1,让figure的像素尺寸和输入图像完全一致,避免缩放导致的空白。 - 禁用窗口渲染:
plt.show()会打开GUI窗口,窗口的边框或缩放逻辑会额外添加白边,直接用fig.canvas.draw()渲染画布内容就不会有这个问题。 - 彻底消除边距:axes设置为
[0., 0., 1., 1.],完全覆盖整个figure,再配合关闭坐标轴和严格的范围设置,确保没有任何多余空间。
如果还是有疑问,你也可以试试更简洁的写法,效果是一样的:
import matplotlib.pyplot as plt import numpy as np height, width = myimage.shape[:2] fig, ax = plt.subplots(figsize=(width, height), dpi=1, frameon=False) ax.set_axis_off() ax.imshow(myimage) ax.set_position([0, 0, 1, 1]) # 强制axes填满figure fig.canvas.draw() data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8).reshape(height, width, 3) plt.close(fig)
内容的提问来源于stack exchange,提问作者matohak
相关产品推荐
相关产品推荐

