numpy / scipyには、画像が配列に格納されています。表示できます。境界線、軸、ラベル、タイトルなどを使用savefig
せずに保存したいと思います。純粋な画像だけで、他には何もありません。
PyPNG
またはのようなパッケージは避けたいのですがscipy.misc.imsave
、問題が発生することがあります(常にうまくインストールされるとは限らずsavefig()
、私にとっては基本的なものにすぎません)
回答:
編集
変更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(…)
ます。この種のもので遊ぶ方法の感触をつかむために、特にAxes、Axis、Artistの主題に関するmatplotlibのドキュメントを読んでください。
w
とh
でパラメータfig.set_size_inches(w,h)
とdpi
のパラメータをfig.savefig(fname, dpi)
ので、それが24ピクセルでは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)
(を使用してget_window_extent
)軸内の画像のbboxを見つけ、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)
したがって、bboxをタイトモードに設定した後に残ったパディングを削除するために、ここから少し追加してheron13の回答を提案します。
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]])
ます。
上記の回答は余白とパディングの削除に対応していますが、ラベルの削除では機能しませんでした。後でこの質問に出くわした人のために、これがうまくいったことです:
次の場所に保存されている4つの画像からのサブプロットの2x2グリッドが必要であると仮定しますimages
。
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')
実際、私は最近これを試しましたが、これらすべての行の代わりに、
plt.imsave(image_path, image)
チャームのように機能します。たった1行で問題が解決しました。
imsave()
ドキュメント(https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imsave.html)
ここのヒントを使用して、境界線も削除しようとしましたが、実際には何も機能しませんでした。いじくり回してみると、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()
私にとって、このコードは、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