2016-05-04 58 views
0

我尝试了很多方法,但似乎没有任何效果。我看到的每一个人都说集bbox_inches='tight',但似乎并不奏效。当在图像顶部绘图时删除matplotlib中的空格

基本上我的目标是在像素坐标上绘制图像上的一些点,然后在边界周围没有任何空白的情况下保存它。我的代码目前看起来像这样:

import matplotlib.pyplot as plt 
plt.ion() 
img = plt.imread('myimage.jpg') 
ymax, xmax, _ = img.shape 
plt.imshow(img, extent=[0,xmax,ymax,0]) # switch to pixel coords 
plt.plot([100,200,300],[100,200,300],'ro') 
plt.imshow(img, extent=[0,xmax,ymax,0]) # recenter plot 
plt.axis('off') 
plt.savefig('out.jpg', bbox_inches='tight', pad_inches=0) 

但我保存的图像仍然有一个白色的边框。我怎样才能解决这个问题?

+0

因为matplotlib几乎是相同的它是如何工作方面MATLAB。 – Vivek

回答

0

看起来bbox_inches='tight'选项试图让你的身材与坐标轴符合。为了避免这种情况,您可以将该图的实际范围提供给plt.savefig方法。

import matplotlib.pyplot as plt 
img = plt.imread('myimage.jpg') 

ymax, xmax, _ = img.shape 
plt.imshow(img, extent=[0,xmax,ymax,0]) # switch to pixel coords 
plt.plot([100,200,300],[100,200,300],'ro') 
plt.imshow(img, extent=[0,xmax,ymax,0]) # recenter plot 
plt.axis('off') 

# get figure and axis handle 
fig = plt.gcf() 
ax = plt.gca() 
# get axis extent 
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) 
plt.savefig('out.jpg', bbox_inches=extent) 

如果出于某种原因想要为图形添加一个小白色边缘,您仍然可以这样做;只是扩大范围如下

extent2 = extent.expanded(1.01, 1.01) 
plt.savefig('out.jpg', bbox_inches=extent2) 

的其他选项将得到-RID离轴边界完全使用matehat's建议。

import matplotlib.pyplot as plt 


img = plt.imread('myimage.jpg') 
ymax, xmax, _ = img.shape 
my_dpi = 80. 
my_figsize = [xmax/my_dpi, ymax/my_dpi] 
fig = plt.figure(figsize=my_figsize, dpi=my_dpi) 
ax = plt.Axes(fig, [0., 0., 1., 1.]) 
ax.set_axis_off() 
fig.add_axes(ax) 

h_im = ax.imshow(img, aspect = 'equal', extent=[0,xmax,ymax,0]) 
plt.plot([100,200,300],[100,200,300],'ro') 
plt.axis(h_im.get_extent()) 
plt.savefig('out.jpg', dpi = my_dpi) 

尽管最终图像具有原始图像大小,但两个图像之间存在子像素差异。下图显示了myimage.jpgout.jpg之间的差异。

Difference between original image and output image

+0

虽然这改变了输出的纵横比。我希望保存的图像与输入图像的尺寸相同。我会怎么做? – Vivek

+0

修改了答案。 – hashmuke