2장. 이미지 입출력과 영상 시각화
Matplotlib 의 짜임
미술 시간에 도화지 한 장을 칸으로 나눠 그림 여러 개를 그린 적이 있을 것입니다. 칸마다 그림을 그리고, 칸 위에 제목을 적고, 필요 없는 테두리는 지웁니다. Matplotlib 도 도화지(figure)와 칸(axes)으로 짜여 있습니다.
그림의 초록 테두리가 도화지 전체(figure)이고, 그 안의 그림 두 개가 칸(axes)입니다. 다홍 글자가 칸마다 붙인 제목입니다. 왼쪽 칸은 눈금이 그대로 있어 가로·세로 칸 번호를 읽을 수 있고, 오른쪽 칸은 axis("off") 로 눈금을 숨겼습니다. 여기서 도화지가 figure, 칸이 axes, 칸 위의 제목이 set_title 입니다.
두 가지 쓰는 법
Matplotlib 은 같은 일을 두 가지 꼴로 적을 수 있습니다. plt. 으로 바로 그리는 꼴은 지금 그리는 칸 하나에 그립니다. fig, ax 를 받아 그리는 꼴은 어느 칸에 그릴지 이름으로 짚습니다. 칸이 둘 이상이면 fig, ax 꼴이 헷갈리지 않습니다.
| 하는 일 | plt 꼴 | fig, ax 꼴 |
|---|---|---|
| 도화지 만들기 | plt.figure(figsize=(6, 4)) | fig, ax = plt.subplots(figsize=(6, 4)) |
| 그림 넣기 | plt.imshow(rgb) | ax.imshow(rgb) |
| 제목 | plt.title("제목") | ax.set_title("제목") |
| 눈금 숨기기 | plt.axis("off") | ax.axis("off") |
| 도화지 전체 제목 | plt.suptitle("큰 제목") | fig.suptitle("큰 제목") |
| 보이기 | plt.show() | plt.show() |
figsize 는 figure size(도화지 크기)로, (가로, 세로)를 인치로 줍니다. suptitle 은 super title(위의 큰 제목)의 줄임입니다.
import cv2
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Malgun Gothic"
plt.rcParams["axes.unicode_minus"] = False
img = cv2.imread("ch02_market.png")
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# fig, ax 꼴: 도화지와 칸을 받아 칸에 그린다
fig, ax = plt.subplots(figsize=(5, 4))
ax.imshow(rgb)
ax.set_title("눈금으로 자리 읽기")
ax.set_xlabel("x (가로 칸 번호)")
ax.set_ylabel("y (세로 칸 번호)")
plt.show()주의할 점
- 한글 제목이 네모(□)로 깨지면
plt.rcParams["font.family"] = "Malgun Gothic"을 먼저 실행합니다. plt.imshow는 그림을 넣을 때 세로 눈금을 위에서 아래로 매깁니다. 그래서 눈금으로 읽은 숫자가 그대로 (x, y) 좌표가 됩니다.