Skip to main content
 首页 » 编程设计

python之从 matplotlib savefig 中删除空格

2025年05月04日9dflying

我正在尝试读取一系列 .bmp 图像,并根据我得到的提示进行一些线性对比度调整。这些图像很小,为 112x112,我希望它们在对比度调整后看起来完全一样。我试过用 matplotlib 来做,但无论我做什么,我都会在图像的边界周围得到空白。这是我正在使用的代码:

# Open image and convert to array 
oldImage = Image.open(f) 
imageArray = np.array(oldImage) 
 
# Preprocessing 
vrange = stats.mquantiles(imageArray.flatten(),prob=[0.01,0.99]) 
 
# Plot and save 
fig = plt.figure() 
fig.set_size_inches(1,1) 
fig.set_dpi(112) 
plt.imshow(imageArray,cmap="gray",interpolation="Nearest",vmin=vrange[0],vmax=vrange[1]); 
plt.axis('off') 
plt.savefig(f[:-4] + "_adjusted.png", bbox_inches='tight') 

关于如何删除填充的任何提示?我进行了一些谷歌搜索,但到目前为止我没有找到任何有用的东西。

请您参考如下方法:

您可以在没有 matplotlib 的情况下进行阈值处理:

import os 
from PIL import Image 
import numpy as np 
import scipy.stats.mstats as mstats 
 
f = os.path.expanduser('~/tmp/image.png') 
name, ext = os.path.splitext(f) 
out = name+"_adjusted.png" 
 
oldImage = Image.open(f).convert('L') 
imageArray = np.array(oldImage) 
 
vmin, vmax = mstats.mquantiles(imageArray.flatten(), prob=[0.01,0.99]) 
 
np.clip(imageArray, vmin, vmax, out=imageArray) 
imageArray = (imageArray-vmin)*255/(vmax-vmin) 
img = Image.fromarray(imageArray.astype('uint8'), 'L') 
img.save(out) 

这样,您就不必定义以英寸为单位的图形尺寸和 DPI 等。您只需将 PIL 图像转换为 numpy 数组,进行一些数学运算,然后再转换回 PIL 图像。