在numpy / scipy中,我有一个存储在数组中的图像。我可以显示它,我想使用savefig
保存它,不用任何边框,轴,标签,标题,......只是纯图像,没有别的。
我想避免使用PyPNG
或scipy.misc.imsave
这样的软件包,它们有时会出现问题(它们并不总是安装得很好,对我来说只有基本savefig()
答案 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)
对于我来说,此代码使输入图像的大小与matehat,unutbu和WHZW代码相似,但没有帧和轴:
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()