在图像顶部绘图时,删除matplotlib中的空格

时间:2016-05-04 02:56:21

标签: python matplotlib

我尝试过很多方法,但似乎都没有。无论我到哪里,人们都会说bbox_inches='tight',但这似乎不起作用。

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

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)

但是我保存的图像周围仍然有一个白色边框。我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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)

另一个选项是使用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