matplotlib로 그린 이미지를 여백없이 저장

작성일: 20210313
언어: Python

matplotlib로 그린 그림을 내보낼 때 여백없이 저장하고 싶습니다.
이미지 위에 레이블을 덮어 쓰고 plot하는 경우 matplotlibplt.savefig 함수를 사용하여 파일을 저장한다고 가정합니다.

보충 :이 기사에서 다루지 않은 것 - 다른 패키지를 사용하여 이미지 저장

이번에는 matplotlib를 사용하여 이미지를 저장하는 방법을 기사로하고있다.

이 외에 scikit-imageio.imsave 로의 저장을 시도했지만, 이미지만 밖에 내보낼 수 있었다 (덮어쓴 플롯을 저장할 수 없었다). 다만, 내가 조사되지 않은 것만으로scikit-image 하지만 덧쓰기 플롯과 함께 이미지를 보존할 수 있는 방법이 있을지도 모른다.

또한 Pillow 또는 OpenCV를 사용한 이미지 저장은 조사하지 않았으므로 이러한 패키지에서도 유사한 작업을 수행 할 수있는 방법이있을 수 있습니다.

1. 참고 링크



matplotlib ver3.3.4 공식 페이지에서 Customizing Matplotlib with style sheets and rcParams
htps // tp t b. 오 rg/s타 bぇ/개별 ls/인 t로즈 c와 ry/쿠s와 미진 g. HTML? 히 gh ght = 푹신 푹신. bpぉt. 「나메」 # 아사 mp

matplotlib의 엄청나게 정리
htps : // 이 m / 똥 y / ms / d1 에 b91 에 33b9d6469 에 f51
※ 상기의 기사에는 직접 「여백을 없애는」커멘드는 실려 있지 않지만, matplotlib에서의 묘화에 대해 이해할 때의 참고로 했다.

2. 샘플 코드



2-1. 기본 표시(여백 있음)



matplotlib_savefig_default.py
### 余白あり
import matplotlib.pyplot as plt
from skimage import io

img = io.imread('sample_sashimi.jpg')
fig, ax = plt.subplots(figsize=(img.shape[1]/10, img.shape[0]/10))

## デフォルトでは余白(figure背景)とウェブページ背景との区別がつかないので、背景の色を変更
fig.patch.set_facecolor('antiquewhite')

## 画像を表示
plt.imshow(img, cmap='gray')

## 画像上に円をプロット
c = plt.Circle((500, 500), 20, color='cyan', linewidth=1, fill=True)
ax.add_patch(c)

plt.axis('tight')
plt.axis('off')

plt.savefig('sushi_margin.jpg') #写真の周りに余白がある
plt.show()


저장된 이미지는 여기. (※샘플 화상은 가족이 촬영한 것입니다)



베이지 색이 붙은 부분이 여백으로 출력됩니다. 이 여백을 지우고 싶다.

2-2. 여백 없음 -- fig.subplots_adjust()


fig.subplots_adjust()에서 여백을 변경합니다.
plt.savefig() 앞에 fig.subplots_adjust(left=0, right=1, bottom=0, top=1) 라는 한 줄을 넣으면 된다.
다만, figsize의 지정에 주의(자세한 것은 아래의 샘플 프로그램중의 코멘트를 참조).

matplotlib_savefig_no_margin.py
### 余白なし
import matplotlib as mpl
import matplotlib.pyplot as plt
from skimage import io #比較用


fig, ax = plt.subplots(figsize=(img.shape[1]/10, img.shape[0]/10))
# 【注意】
# figsizeは画像の縦横比と一致させること。
# ここでfigsize=(10,10)などと元の画像の縦横比と違う値を指定してしまうと、
# 無理やり余白をゼロにしようとしてfigsizeに合わせて画像の縦横比が変更されてしまうので注意。

## デフォルトでは余白(figure背景)とウェブページ背景との区別がつかないので、背景の色を変更
fig.patch.set_facecolor('antiquewhite')

## 画像を表示
plt.imshow(img, cmap='gray')

## 画像上に円をプロット
c = plt.Circle((500, 500), 20, color='cyan', linewidth=1, fill=True)
ax.add_patch(c)

plt.axis('tight')
plt.axis('off')
fig.subplots_adjust(left=0, right=1, bottom=0, top=1) #この1行を入れる
plt.savefig('sushi_no_margin.jpg')

## 参考:比較用にio.imsaveで保存してみる
io.imsave('sushi_io.jpg', img) #io.imsaveでは新たに描画した図形は出力されない

plt.show()




여백이 사라졌다.

덧붙여서, io.imsave 로 보존한 결과가 아래의 그림. 덮어쓴 플롯(여기서는 청록색 원)이 저장되지 않습니다.


3. 보충 -- matplotlib.rcParams에서 그림 레이아웃 설정 변경



SubplotParams (fig.subplots_adjust())는 캔버스 왼쪽 하단을 (0,0), 오른쪽 상단을 (1,1)로 사용하여 축의 위치를 ​​결정하는 매개 변수입니다.

여백에 한정하지 않고, 레이아웃의 설정을 변경하고 싶을 때는, matplotlib rc file중의 rcParams를 일시적으로 변경하면 된다.matplotlib rc file 라는 것은, matplotlib 가 최초로 configure 되었을 때에 읽히는 설정 파일로, 디폴트의 그림의 레이아웃 설정을 규정하고 있다. 거기의 파라미터를 일시적으로 변경하면, figure의 레이아웃을 좋아하게 조절할 수 있다(※).

※보충 내가 조사한 범위에서의 이해는 이런데, 잘못되었을 가능성도 충분히 있다. 아래 링크 등에서 각자 확인되었고.

자세한 내용은 아래 링크 참조.
matplotlib ver3.3.4 공식 페이지에서 Customizing Matplotlib with style sheets and rcParams
rc file의 내용을 살펴보면 margin의 매개 변수를 지정하는 부분은 다음과 같습니다.

matplotlib_rc_file.py
## The figure subplot parameters.  All dimensions are a fraction of the figure width and height.
#figure.subplot.left:   0.125  # the left side of the subplots of the figure
#figure.subplot.right:  0.9    # the right side of the subplots of the figure
#figure.subplot.bottom: 0.11   # the bottom of the subplots of the figure
#figure.subplot.top:    0.88   # the top of the subplots of the figure

jupyter notebook에서 이러한 매개 변수를 표시해보십시오.

matplotlib_rcParams.py
import matplotlib as mpl

print(mpl.rcParams['figure.subplot.left']) #0.125
print(mpl.rcParams['figure.subplot.right']) #0.9
print(mpl.rcParams['figure.subplot.bottom']) #0.125
print(mpl.rcParams['figure.subplot.top']) #0.88
print(mpl.rcParams['figure.subplot.left']) 등으로 파라미터를 표시하면 left, right, bottom, top은 각각 0.125, 0.9, 0.125, 0.88이 된다. fig.subplots_adjust() 에서는 디폴트치는 변경되지 않고, 현재 draw 하고 있는의 figure 에서만 변경된다.

setting_no_margin.py

# 余白の変更は、
fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
# と書いても、

import matplotlib as mpl
mpl.rc('figure.subplot', left=0, right=1, bottom=0, top=1)
# と書いても、どちらでも同じ結果になる。


#ただし、
mpl.rcParams['figure.subplot.left']=0
mpl.rcParams['figure.subplot.right']=1
mpl.rcParams['figure.subplot.bottom']=0
mpl.rcParams['figure.subplot.top']=1
#とするとデフォルトの設定ごと書き換わってしまうので、これはやらない方が良さそう。

좋은 웹페이지 즐겨찾기