OpenCV 비전 실무3장 · 디지털 영상과 색공간 변환4 / 21← 이전목차다음 →MetaContents

3장. 디지털 영상과 색공간 변환

해상도

작은 블록 장난감으로 과일 그림을 만든다고 해 봅시다. 블록을 가로 16개, 세로 12개만 쓰면 사과인지 귤인지 겨우 짐작합니다. 블록을 가로 320개, 세로 240개 쓰면 사과의 꼭지와 빛 반사까지 보입니다. 대신 블록이 많이 들고 보관할 자리도 커집니다. 해상도가 바로 이 블록의 개수입니다.

같은 바구니 그림을 320×240, 80×60, 32×24, 16×12 칸으로 줄였다가 다시 키운 네 그림

왼쪽부터 칸 수를 줄여 가며 같은 크기로 다시 키운 그림입니다. 80×60 까지는 과일이 잘 보이지만, 32×24 에서는 포도알이 뭉개지고 16×12 에서는 색 덩어리만 남습니다. 여기서 블록 하나가 픽셀이고, 블록의 가로세로 개수가 해상도입니다. 다만 블록 장난감과 달리 디지털 그림은 칸을 줄이는 순간 잃은 정보를 다시 키워도 되돌릴 수 없습니다.

해상도와 크기

해상도화소 수컬러(uint8) 메모리흔히 부르는 이름
320×24076,800칸230,400바이트 (약 0.2MB)QVGA(Quarter VGA, VGA 의 4분의 1), 이 과정의 실습 그림
640×480307,200칸921,600바이트 (약 0.9MB)VGA(Video Graphics Array), 오래된 웹캠
1920×10802,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배가 됩니다.

Python
# 해상도마다 메모리 크기를 계산한다: 가로 × 세로 × 채널 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장에서 배웁니다.
← 이전 절3장 · 픽셀과 좌표 다시 보기다음 절 →3장 · 비트 깊이와 데이터형