我尝试过很多方法,但似乎都没有。无论我到哪里,人们都会说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)
但是我保存的图像周围仍然有一个白色边框。我该如何解决这个问题?
答案 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.jpg
和out.jpg
之间的差异。