Jestem nowy w Pythonie i Matplotlib, chciałbym po prostu zastosować mapę kolorów do obrazu i napisać obraz wynikowy, bez używania osi, etykiet, tytułów lub czegokolwiek zwykle automatycznie dodawanego przez matplotlib. Oto co zrobiłem:
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)
Z powodzeniem usuwa oś figury, ale zapisana figura przedstawia białe wypełnienie i ramkę wokół rzeczywistego obrazu. Jak mogę je usunąć (przynajmniej białe wypełnienie)? Dzięki
python
matplotlib
sunmat
źródło
źródło
imshow
. Jeśli zamiast tego masz wykres rozrzutu, może Ci pomóc następująca odpowiedź: stackoverflow.com/a/40727744/4124317Odpowiedzi:
Myślę, że polecenie
axis('off')
zajmuje się jednym z problemów bardziej zwięźle niż osobna zmiana każdej osi i granicy. Jednak nadal pozostawia biały obszar wokół granicy. Dodaniebbox_inches='tight'
dosavefig
polecenia prawie Cię tam prowadzi, możesz zobaczyć w poniższym przykładzie, że biała przestrzeń po lewej jest znacznie mniejsza, ale wciąż obecna.Zauważ, że nowsze wersje matplotlib mogą wymagać
bbox_inches=0
zamiast ciągu znaków'tight'
(przez @episodeyang i @kadrach)źródło
fig = plt.figure()
,ax = plt.axes([0,0,1,1])
, a następnieplt.imshow(data,interpolation="nearest"
. W połączeniu zplt.axis("off")
tym powinien pozbyć się wszystkiego oprócz samego obrazu, miejmy nadzieję!bbox_inches=0
załatwiło sprawę.Nauczyłem się tej sztuczki od matehat, tutaj :
daje
źródło
plt.Axes(fig, [0,0,1,1])
. Mówi to matplotlibowi, aby utworzył zestaw osi z lewym dolnym rogiem w punkcie znajdującym się w (0%, 0%) oraz o szerokości i wysokości (100%, 100%).Możliwe najprostsze rozwiązanie:
Po prostu połączyłem metodę opisaną w pytaniu i metodę z odpowiedzi Hooked.
Po tym kodzie nie ma białych znaków ani ramki.
źródło
fig.axes.get_xaxis().set_visible(False)
rozwiązało problem. Dziękifig.axes[0]
i ogólnie wszystkie lub wybrane osie.Nikt
imsave
jeszcze o tym nie wspominał , co sprawia, że jest to jeden liniowiec:Bezpośrednio przechowuje obraz takim, jaki jest, tzn. Nie dodaje żadnych osi ani obramowania / wypełnienia.
źródło
Możesz także określić zakres liczby dla
bbox_inches
argumentu. Pozbyłoby się to białej wyściółki wokół postaci.źródło
To powinno usunąć wszystkie wypełnienia i obramowania:
źródło
ax
) zextent = plt.gca().get_window_extent().transformed(fig.dpi_scale_trans.inverted())
.Odkryłem, że wszystko jest udokumentowane ...
https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.axis.html#matplotlib.axes.Axes.axis
Mój kod… „bcK” to obraz o wymiarach 512 x 512
źródło
Pozytywna odpowiedź już nie działa. Aby to zadziałało, musisz ręcznie dodać zestaw osi do [0, 0, 1, 1] lub usunąć łatkę pod rysunkiem.
Możesz też po prostu usunąć łatkę. Nie trzeba dodawać wątku podrzędnego, aby usunąć wypełnienia. Upraszcza to poniższa odpowiedź Vlady
Zostało to przetestowane w wersji
3.0.3
2019/06/19. Zdjęcie patrz poniżej:Znacznie prostszą rzeczą jest użycie
pyplot.imsave
. Aby uzyskać szczegółowe informacje, patrz odpowiedź luatora poniżejźródło
Podobała mi się odpowiedź ubuntu , ale nie pokazywała wyraźnie, jak ustawić rozmiar niekwadratowych obrazów od razu po wyjęciu z pudełka, więc zmodyfikowałem go, aby łatwo skopiować i wkleić:
Zapisywanie obrazów bez obramowania jest łatwe bez względu na wybraną rozdzielczość, jeśli zachowany jest rozmiar piksela / dpi = rozmiar.
Jednak wyświetlanie jest upiorne. Jeśli wybierzesz małą rozdzielczość, rozmiar obrazu może być większy niż ekran, a ramka będzie wyświetlana podczas wyświetlania. Niemniej jednak nie wpływa to na oszczędzanie.
Więc dla
Wyświetlacz zostaje otoczony (ale zapisywanie działa):
źródło
Po pierwsze, w przypadku niektórych formatów obrazów (np. TIFF ) można faktycznie zapisać mapę kolorów w nagłówku, a większość przeglądających wyświetli dane za pomocą mapy kolorów.
Do zapisania rzeczywistego
matplotlib
obrazu, który może być przydatny do dodawania adnotacji lub innych danych do obrazów, zastosowałem następujące rozwiązanie:źródło
Dzięki za niesamowite odpowiedzi od wszystkich ... Miałem dokładnie ten sam problem z chęcią wykreślenia obrazu bez dodatkowej wypełnienia / miejsca itp., Więc byłem bardzo szczęśliwy, że znalazłem tutaj pomysły wszystkich.
Oprócz obrazu bez wypełnienia, chciałem również móc łatwo dodawać adnotacje itp., Poza prostą fabułą.
Skończyło się na tym, że połączyłem odpowiedź Davida z csnemes ', by stworzyć proste opakowanie w momencie tworzenia postaci. Kiedy tego użyjesz, nie potrzebujesz później żadnych zmian za pomocą imsave () lub czegokolwiek innego:
źródło