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 픽셀로 24 픽셀이 발생할 것을, 그것은 잘 작동합니다. 예를 들어, 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)
나는 여기 에서 Joe Kington에게서이 트릭을 배웠다 .
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
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')
여기 팁을 사용하여 테두리를 제거하려고 시도했지만 실제로 효과가 없었습니다. 약간 어슬렁 거리면서 나는 안면을 바꾸는 것이 jupyter labs에서 나에게 경계선을주지 않는다는 것을 발견했다 (어떤 색깔이든지 흰색 경계선을 없앴다). 도움이 되었기를 바랍니다.
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