OpenCV 비전 실무2장 · 이미지 입출력과 영상 시각화11 / 21← 이전목차다음 →MetaContents

2장. 이미지 입출력과 영상 시각화

확대해서 보기

돋보기로 신문 사진을 보면 매끈하던 사진이 작은 점의 모임으로 보입니다. 화면의 그림도 크게 키우면 픽셀 네모가 드러납니다. 그런데 Matplotlib 이 그림을 키울 때 칸 사이를 부드럽게 섞어 그리면 네모가 흐려져 픽셀 하나하나를 읽기 어렵습니다.

상품 그림의 가격표 부분을 bilinear 로 섞어 키운 것과 nearest 로 네모 그대로 키운 것을 견준 그림

그림의 ①에서 다홍 상자 부분을 잘라 ②와 ③으로 키웠습니다. ②는 칸 사이를 섞어 그린 것(bilinear)이라 글자 테두리가 뿌옇습니다. ③은 가장 가까운 칸의 값을 그대로 쓴 것(nearest)이라 픽셀 네모가 또렷합니다. 여기서 돋보기가 잘라 내기와 확대이고, 점이 그대로 보이는 것이 interpolation="nearest" 입니다.

확대와 밝기 범위를 정하는 값

값원래 말뜻
interpolation="nearest"nearest(가장 가까운)키울 때 가장 가까운 칸의 값을 그대로 쓴다. 픽셀 네모가 보인다
interpolation="bilinear"bi(둘) + linear(직선)가로·세로 두 방향으로 이웃 칸을 섞는다. 부드럽지만 흐리다
기본값 "auto"auto(알아서)화면에서 3배 넘게 키우면 nearest, 덜 키우면 부드럽게 섞는다
vmin=0, vmax=255value min, value max흑백 그림에서 0 을 검정, 255 를 흰색으로 못 박는다

vmin, vmax 가 필요한 까닭

Matplotlib 은 흑백 그림을 띄울 때 그림 안에서 가장 작은 값을 검정, 가장 큰 값을 흰색으로 늘려 보여 줍니다. 그래서 0~60 사이의 숫자만 있는 아주 어두운 그림도 밝게 보입니다. 실제 밝기를 그대로 보려면 vmin=0, vmax=255 를 줍니다.

Python
import cv2
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = "Malgun Gothic"
plt.rcParams["axes.unicode_minus"] = False

gray = cv2.imread("ch02_product.png", cv2.IMREAD_GRAYSCALE)
dark = gray // 4                         # 모든 칸을 4로 나눠 0~63 의 어두운 그림을 만든다
print("어두운 그림의 범위:", int(dark.min()), "~", int(dark.max()))

fig, axes = plt.subplots(1, 2, figsize=(8, 3))
axes[0].imshow(dark, cmap="gray")                     # 범위를 늘려 보여 준다 → 밝아 보인다
axes[0].set_title("vmin, vmax 없음")
axes[1].imshow(dark, cmap="gray", vmin=0, vmax=255)   # 실제 밝기 그대로 → 어둡다
axes[1].set_title("vmin=0, vmax=255")
plt.show()

주의할 점

  • interpolation 은 화면에 보이는 모습만 바꿉니다. 배열의 숫자는 그대로입니다. 그림 자체의 크기를 바꾸는 일은 cv2.resize 가 하고 14장에서 다룹니다.
  • 처리 전후의 흑백 그림을 견줄 때는 두 칸 모두 vmin=0, vmax=255 를 줍니다. 칸마다 범위를 따로 늘리면 밝기 차이가 보이지 않습니다.
← 이전 절2장 · 여러 장 나란히 놓기다음 절 →2장 · 결과를 그림 파일로 남기기