在numpy / scipy中,我将图像存储在数组中。我可以显示它,我想使用它来保存它,savefig
而没有任何边框,轴,标签,标题等。。。只是纯图像而已。
我想避免像PyPNG
或那样的软件包scipy.misc.imsave
,有时它们有问题(它们并不总是安装得很好,仅对savefig()
我而言是基本的
Answers:
编辑
更改aspect='normal
为,aspect='auto'
因为在最新版本的matplotlib中该更改(由于@ Luke19)。
假设 :
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='auto')
fig.savefig(fname, dpi)
该aspect
参数更改像素大小,以确保他们填写指定的数字大小fig.set_size_inches(…)
。要了解如何玩这种东西,请通读matplotlib的文档,尤其是有关“轴,轴和艺术家”主题的文档。
w
和h
参数设置为和fig.set_size_inches(w,h)
中将dpi
参数设置为fig.savefig(fname, dpi)
24px x 24px,则它应该可以正常工作。例如,w = h = 1
和dpi = 24
imshow
的语法改为,aspect='auto'
而不是'normal'
)。
ax = plt.Axes(fig, [0., 0., 1., 1.])
是什么使它起作用。
似乎更简单的解决方案是:
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
fig.savefig('out.png', bbox_inches='tight',transparent=True, pad_inches=0)
您可以在轴内找到图片的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)
我从这里的乔·肯顿那里学到了这个技巧。
plt.axis('off')
帮助。其他答案没有太大帮助。
plt.savefig('/temp/test.png', bbox_inches='tight', transparent=True, pad_inches=0)
代替plt.savefig('/tmp/test.png', bbox_inches=extent)
我已经尝试了几种方法,而最好的解决方案是:
fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)
然后用 savefig
我将建议在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)
在使用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()
extent.get_points()*np.array([[1.1],[.9]])
。
虽然以上答案解决了删除边距和填充的问题,但它们对我来说在删除标签上不起作用。对于后来偶然发现此问题的任何人,这都是有效的方法:
假设您希望从存储在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')
我也尝试使用此处的提示摆脱边界,但没有任何实际效果。经过一些摆弄,我发现在jupyter实验室中更换faceolor不会给我任何边界(任何颜色都会消除白色边界)。希望这可以帮助。
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()
实际上我最近已经尝试过了,您可以使用以下方法代替所有这些方法
plt.imsave(image_path, image)
奇迹般有效。只需一条线即可解决问题。
imsave()
文档(https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imsave.html)
对我来说,此代码使输入图像的大小与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
OS Windows 10