2장. 이미지 입출력과 영상 시각화
결과를 그림 파일로 남기기
요리 대회에서 요리를 남기는 방법은 두 가지입니다. 하나는 요리 자체를 그릇째 냉장고에 넣어 두는 것입니다. 나중에 데워 다시 먹거나 다른 요리에 쓸 수 있습니다. 다른 하나는 요리를 차려 놓고 이름표와 함께 사진을 찍어 두는 것입니다. 보고서에 붙이기 좋지만 사진을 먹을 수는 없습니다. 영상 처리 결과를 남기는 방법도 이렇게 둘입니다.
그림의 왼쪽 cv2.imwrite 는 배열의 숫자를 그대로 파일에 씁니다. 요리를 그릇째 넣어 두는 쪽입니다. 오른쪽 fig.savefig 는 제목, 여러 칸, 눈금이 들어간 도화지 전체를 그림으로 찍어 저장합니다. 이름표와 함께 찍은 사진 쪽입니다. 다음 처리에 다시 쓸 그림은 imwrite 로, 보고서나 수업 자료에 붙일 그림은 savefig 로 남깁니다.
savefig 의 값
| 값 | 원래 말 | 뜻 |
|---|---|---|
fig.savefig("out_ch02_x.png") | save figure(도화지 저장) | 확장자(.png, .jpg, .pdf, .svg)대로 저장한다 |
dpi=120 | dots per inch | 1인치에 점 120개. 가로 9인치면 9 × 120 = 1,080픽셀 |
bbox_inches="tight" | bounding box(둘레 상자) inches | 도화지 둘레의 빈 여백을 잘라 낸다 |
두 저장 견주기
| 견줄 것 | cv2.imwrite | fig.savefig |
|---|---|---|
| 저장하는 것 | 배열의 숫자 | 도화지에 그려진 모습 |
| 크기(픽셀) | 배열과 똑같다 | figsize × dpi 로 정해진다 |
| 제목, 눈금, 여러 칸 | 없다 | 들어간다 |
| 다시 읽어 처리에 쓰기 | 알맞다 | 알맞지 않다 |
| 색 순서 | BGR 배열을 넣는다 | RGB 로 바꿔 그린 모습이 저장된다 |
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("ch02_market.png")
fig, ax = plt.subplots(figsize=(4, 3))
ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax.axis("off")
# 도화지는 가로 4인치 × 100 = 400픽셀이지만, tight 로 둘레 여백을 잘라 더 작아진다
fig.savefig("out_ch02_savefig_demo.png", dpi=100, bbox_inches="tight")
back = cv2.imread("out_ch02_savefig_demo.png")
print("원본 배열:", img.shape, "/ savefig 그림:", back.shape)
plt.show()주의할 점
fig.savefig는plt.show()보다 먼저 부릅니다. 화면에 띄우고 나면 도화지가 비워져 빈 그림이 저장될 수 있습니다.- savefig 로 저장한 그림을 다시 읽어 처리에 쓰지 않습니다. 크기가 바뀌었고 제목과 여백까지 숫자로 들어 있습니다.