Saya baru mengenal Python dan Matplotlib, saya hanya ingin menerapkan colormap ke gambar dan menulis gambar yang dihasilkan, tanpa menggunakan sumbu, label, judul atau apa pun yang biasanya secara otomatis ditambahkan oleh matplotlib. Inilah yang saya lakukan:
def make_image(inputname,outputname):
data = mpimg.imread(inputname)[:,:,0]
fig = plt.imshow(data)
fig.set_cmap('hot')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig(outputname)
Ini berhasil menghilangkan sumbu gambar, tetapi gambar yang disimpan menyajikan padding putih dan bingkai di sekitar gambar yang sebenarnya. Bagaimana saya bisa menghapusnya (setidaknya lapisan putih)? Terima kasih
python
matplotlib
sunmat
sumber
sumber
imshow
. Jika Anda memiliki sebar sebaran, jawaban berikut mungkin dapat membantu Anda: stackoverflow.com/a/40727744/4124317Jawaban:
Saya berpikir bahwa perintah
axis('off')
menangani salah satu masalah lebih ringkas daripada mengubah setiap sumbu dan perbatasan secara terpisah. Namun masih meninggalkan ruang putih di sekitar perbatasan. Menambahkanbbox_inches='tight'
kesavefig
perintah hampir membuat Anda di sana, Anda dapat melihat pada contoh di bawah ini bahwa ruang putih yang tersisa jauh lebih kecil, tetapi masih ada.Perhatikan bahwa versi yang lebih baru dari matplotlib mungkin memerlukan
bbox_inches=0
alih-alih string'tight'
(via @episodeyang dan @kadrach)sumber
fig = plt.figure()
,ax = plt.axes([0,0,1,1])
, kemudianplt.imshow(data,interpolation="nearest"
. Dikombinasikan denganplt.axis("off")
, semestinya itu menyingkirkan segala sesuatu di samping gambar itu sendiri, semoga!bbox_inches=0
melakukan trik.Saya belajar trik ini dari matehat, di sini :
hasil panen
sumber
plt.Axes(fig, [0,0,1,1])
. Ini memberitahu matplotlib untuk membuat satu set sumbu dengan sudut kiri bawah pada titik yang terletak di (0%, 0%), dan dengan lebar dan tinggi (100%, 100%).Kemungkinan solusi paling sederhana:
Saya hanya menggabungkan metode yang dijelaskan dalam pertanyaan dan metode dari jawaban oleh Hooked.
Setelah kode ini tidak ada spasi putih dan tidak ada bingkai.
sumber
fig.axes.get_xaxis().set_visible(False)
menyelesaikan masalah. Terima kasihfig.axes[0]
dan secara umum semua atau sumbu yang dipilih.Tidak ada yang disebutkan
imsave
, yang membuat ini satu kalimat:Langsung menyimpan gambar apa adanya, yaitu tidak menambahkan sumbu atau perbatasan / padding.
sumber
Anda juga bisa menentukan tingkat gambar hingga
bbox_inches
argumen. Ini akan menghilangkan lapisan putih di sekitar sosok itu.sumber
Ini harus menghapus semua bantalan dan batas:
sumber
ax
) denganextent = plt.gca().get_window_extent().transformed(fig.dpi_scale_trans.inverted())
.Saya menemukan bahwa itu semua didokumentasikan ...
https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.axis.html#matplotlib.axes.Axes.axis
Kode saya .... "bcK" adalah gambar 512x512
sumber
Jawaban terunggah tidak berfungsi lagi. Untuk membuatnya bekerja, Anda perlu secara manual menambahkan sumbu yang diatur ke [0, 0, 1, 1], atau menghapus patch di bawah gambar.
Atau, Anda bisa menghapus tambalan. Anda tidak perlu menambahkan subplot untuk menghapus paddings. Ini disederhanakan dari jawaban Vlady di bawah ini
Ini diuji dengan versi
3.0.3
pada 2019/06/19. Gambar lihat di bawah:Hal yang lebih sederhana untuk dilakukan adalah menggunakan
pyplot.imsave
. Untuk detailnya, lihat jawaban luator di bawahsumber
Saya menyukai jawaban ubuntu , tetapi itu tidak menunjukkan secara eksplisit bagaimana mengatur ukuran untuk gambar non-kotak out-of-the-box, jadi saya memodifikasinya untuk mudah salin-tempel:
Menyimpan gambar tanpa batas itu mudah, apa pun dpi yang Anda pilih jika pixel_size / dpi = ukuran disimpan.
Namun tampilan itu seram. Jika Anda memilih dpi kecil, ukuran gambar Anda bisa lebih besar dari layar Anda dan Anda mendapatkan batas selama tampilan. Namun demikian, ini tidak mempengaruhi tabungan.
Sehingga untuk
Layar menjadi berbatasan (tetapi menyimpan karya):
sumber
Pertama, untuk format gambar tertentu (yaitu TIFF ) Anda sebenarnya dapat menyimpan colormap di header dan sebagian besar pemirsa akan menampilkan data Anda dengan colormap.
Untuk menyimpan
matplotlib
gambar yang sebenarnya , yang dapat berguna untuk menambahkan anotasi atau data lain ke gambar, saya telah menggunakan solusi berikut:sumber
Terima kasih atas jawaban luar biasa dari semua orang ... Saya memiliki masalah yang sama persis dengan keinginan untuk merencanakan hanya gambar tanpa bantalan tambahan / ruang dll, jadi sangat senang menemukan ide semua orang di sini.
Terlepas dari gambar tanpa padding, saya juga ingin dapat dengan mudah menambahkan anotasi dll, lebih dari sekadar plot gambar sederhana.
Jadi apa yang akhirnya saya lakukan adalah menggabungkan jawaban David dengan csnemes ' untuk membuat pembungkus sederhana pada saat pembuatan gambar. Saat Anda menggunakannya, Anda tidak perlu melakukan perubahan nanti dengan imsave () atau yang lainnya:
sumber