3장. 디지털 영상과 색공간 변환
해상도
작은 블록 장난감으로 과일 그림을 만든다고 해 봅시다. 블록을 가로 16개, 세로 12개만 쓰면 사과인지 귤인지 겨우 짐작합니다. 블록을 가로 320개, 세로 240개 쓰면 사과의 꼭지와 빛 반사까지 보입니다. 대신 블록이 많이 들고 보관할 자리도 커집니다. 해상도가 바로 이 블록의 개수입니다.
왼쪽부터 칸 수를 줄여 가며 같은 크기로 다시 키운 그림입니다. 80×60 까지는 과일이 잘 보이지만, 32×24 에서는 포도알이 뭉개지고 16×12 에서는 색 덩어리만 남습니다. 여기서 블록 하나가 픽셀이고, 블록의 가로세로 개수가 해상도입니다. 다만 블록 장난감과 달리 디지털 그림은 칸을 줄이는 순간 잃은 정보를 다시 키워도 되돌릴 수 없습니다.
해상도와 크기
| 해상도 | 화소 수 | 컬러(uint8) 메모리 | 흔히 부르는 이름 |
|---|---|---|---|
| 320×240 | 76,800칸 | 230,400바이트 (약 0.2MB) | QVGA(Quarter VGA, VGA 의 4분의 1), 이 과정의 실습 그림 |
| 640×480 | 307,200칸 | 921,600바이트 (약 0.9MB) | VGA(Video Graphics Array), 오래된 웹캠 |
| 1920×1080 | 2,073,600칸 | 6,220,800바이트 (약 5.9MB) | Full HD(Full High Definition, 고화질), 요즘 웹캠 |
메모리 크기는 "가로 × 세로 × 채널 수 × 한 칸의 바이트 수"입니다. 320×240 컬러 그림이면 320 × 240 × 3 × 1 = 230,400바이트입니다. MB 는 1,024 × 1,024 바이트로 나눠 구합니다.
그림의 세 단계를 차례로 곱하면 메모리 크기가 나옵니다. 가로와 세로를 각각 2배로 하면 칸 수는 2 × 2 = 4배가 되고, 메모리도 4배가 됩니다.
# 해상도마다 메모리 크기를 계산한다: 가로 × 세로 × 채널 3 × 1바이트(uint8)
for w, h in [(320, 240), (640, 480), (1920, 1080)]:
nbytes = w * h * 3
print(f"{w}×{h}: {w * h:,}칸, {nbytes:,}바이트, {nbytes / 1024 / 1024:.1f}MB")메모리 크기와 파일 크기
메모리 크기는 프로그램이 그림을 펼쳐 놓고 계산할 때 차지하는 자리입니다. 파일 크기는 png, jpg 가 이 숫자를 줄여서(압축해서) 저장한 크기라 훨씬 작습니다. 파일 형식과 압축은 2장에서 보았습니다.
주의할 점
- 해상도를 줄이면 계산은 빨라지지만 작은 흠집이나 글자가 사라집니다. 무엇을 찾을지 보고 해상도를 정합니다.
- 작은 그림을 크게 키워도 새 정보가 생기지 않습니다. 칸이 커질 뿐입니다. 크기 바꾸기(
cv2.resize)의 자세한 옵션은 14장에서 배웁니다.