scipy:savefig没有框架,轴,只有内容

时间:2011-11-21 21:13:48

标签: python image numpy matplotlib scipy

在numpy / scipy中,我有一个存储在数组中的图像。我可以显示它,我想使用savefig 保存它,不用任何边框,轴,标签,标题,......只是纯图像,没有别的。

我想避免使用PyPNGscipy.misc.imsave这样的软件包,它们有时会出现问题(它们并不总是安装得很好,对我来说只有基本savefig()

12 个答案:

答案 0 :(得分:84)

假设:

import matplotlib.pyplot as plt

制作没有框架的图形:

fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)

使内容填满整个数字

ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)

然后在上面绘制图像:

ax.imshow(your_image, aspect='normal')
fig.savefig(fname, dpi)

aspect参数会更改像素大小,以确保它们填充fig.set_size_inches(…)中指定的数字大小。要了解如何使用这类内容,请阅读matplotlib's documentation,特别是关于Axes,Axis和Artist的主题。

答案 1 :(得分:53)

更简单的解决方案似乎是:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

答案 2 :(得分:24)

您可以在轴内找到图像的bbox(使用get_window_extent),并使用bbox_inches参数仅保存图像的该部分:

import numpy as np
import matplotlib.pyplot as plt

data=np.arange(9).reshape((3,3))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
plt.axis('off')
plt.imshow(data)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('/tmp/test.png', bbox_inches=extent)

我从Joe Kington那里学到了这个技巧here

答案 3 :(得分:15)

我在我的案例中尝试了几个选项,最好的解决方案是:

fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)

然后使用savefig

保存您的数字

答案 4 :(得分:8)

我建议使用here中的一点点添加来回答heron13,以便在将bbox设置为紧密模式后删除填充,因此:

axes = fig.axes()
axes.get_xaxis().set_visible(False)
axes.get_yaxis().set_visible(False)
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

答案 5 :(得分:3)

使用librosa进行可视化时我遇到了同样的问题,我希望在没有任何其他信息的情况下提取绘图内容。所以这是我的方法。 unutbu的回答也有助于我开始工作。

    figure = plt.figure(figsize=(500, 600), dpi=1)
    axis = plt.subplot(1, 1, 1)
    plt.axis('off')
    plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off',
                    labelright='off', labelbottom='off')

     # your code goes here. e.g: I used librosa function to draw a image
    result = np.array(clip.feature_list['fft'].get_logamplitude()[0:2])
    librosa.display.specshow(result, sr=api.Clip.RATE, x_axis='time', y_axis='mel', cmap='RdBu_r')


    extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted())
    plt.savefig((clip.filename + str("_.jpg")), format='jpg', bbox_inches=extent, pad_inches=0)
    plt.close()

答案 6 :(得分:3)

这个对我有用

plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)

答案 7 :(得分:2)

虽然以上答案解决了删除边距和填充的问题,但它们对我删除标签并不起作用。对于那些后来偶然发现这个问题的人来说,这是有用的:

假设您想要存储在images中的四个图像的2x2网格子图:

matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require
for i in range(4):
    ax = matplotlib.pyplot.subplot(2,2,i+1)
    ax.axis('off')
    imshow(images[i])
matplotlib.pyplot.savefig(path, bbox_inches='tight')

答案 8 :(得分:2)

实际上我最近已经尝试过了,您可以使用

代替所有这些行
plt.imsave(image_path, image)

像魅力一样工作。只需一条线即可解决问题。

imsave()

文档(https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imsave.html

答案 9 :(得分:1)

对于我来说,此代码使输入图像的大小与matehatunutbuWHZW代码相似,但没有帧和轴:

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.axis('off')
viridis = cm.get_cmap('gist_gray', 256)
plt.imshow(data, aspect='auto', cmap=viridis)
plt.tight_layout()
plt.savefig(out_file, bbox_inches='tight', transparent=True, pad_inches=0)

运行时环境:
Python 3.6.10
Matplotlib 3.2.1
操作系统Windows 10

答案 10 :(得分:0)

对于任何试图在Jupyter中执行此操作的人

 plt.axis('off')

 spec = plt.imshow

 plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)

答案 11 :(得分:0)

我也尝试摆脱边界,使用此处的提示,但没有任何实际效果。 经过一些摆弄,我发现在jupyter实验室中更换面镜不会给我任何边界(任何颜色都会导致摆脱白色边界)。 希望这会有所帮助。

def show_num(data):
data = np.rot90(data.reshape((16,16)), k=3)
data = np.fliplr(data)
fig = plt.figure(frameon=False, facecolor='white')
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(data)
plt.show()

enter image description here