1장. AI 비전과 OpenCV 개발환경
이미지는 숫자 표
모눈종이에 칸마다 색연필로 색을 칠해 그림을 그린다고 해 봅시다. 칸이 아주 많고 작으면 멀리서 볼 때 매끈한 사진처럼 보입니다. 디지털 이미지가 바로 이 모눈종이입니다. 다만 색연필 대신 칸마다 "얼마나 밝은지"를 숫자로 적어 둡니다.
그림은 사과 모양 흑백 이미지를 8×8 칸으로 크게 키운 것입니다. 칸 하나가 픽셀이고, 칸 안의 숫자가 그 칸의 밝기입니다. 0 에 가까울수록 검고, 255 에 가까울수록 흽니다. 여기서 모눈종이가 이미지이고, 칸이 픽셀이고, 칸에 칠한 진하기가 숫자입니다.
왜 0부터 255까지일까
밝기 숫자는 보통 8비트에 담습니다. 비트(bit, binary digit, 2진수 한 자리)는 0 아니면 1 만 적을 수 있는 칸입니다. 칸이 하나면 2가지, 둘이면 2×2=4가지, 여덟 개면 2를 여덟 번 곱한 256가지를 적을 수 있습니다.
| 비트 수 | 계산 | 적을 수 있는 가짓수 | 숫자 범위 |
|---|---|---|---|
| 1 | 2 | 2 | 0~1 (검정, 흰색만) |
| 2 | 2×2 | 4 | 0~3 |
| 8 | 2×2×2×2×2×2×2×2 | 256 | 0~255 |
0부터 세기 시작하므로 256가지는 0~255 입니다. 사람 눈은 256단계 정도면 회색이 매끈하게 이어진다고 느낍니다.
흑백과 컬러
흑백 이미지는 칸마다 숫자가 하나입니다. 컬러 이미지는 칸마다 숫자가 세 개입니다. 빛의 세 가지 기본색인 파랑, 초록, 빨강을 얼마나 섞었는지를 하나씩 적습니다.
| 견줄 것 | 흑백 이미지 | 컬러 이미지 |
|---|---|---|
| 칸마다 숫자 | 1개 (밝기) | 3개 (파랑, 초록, 빨강) |
| 배열 모양 | (세로, 가로) | (세로, 가로, 3) |
| 320×240 크기의 숫자 개수 | 320×240 = 76,800개 | 76,800×3 = 230,400개 |
import numpy as np
# 컬러 픽셀 하나. OpenCV 는 [파랑, 초록, 빨강] 순서(BGR)로 적는다
red = np.array([0, 0, 255], dtype=np.uint8) # 빨강만 가득
yellow = np.array([0, 255, 255], dtype=np.uint8) # 초록 + 빨강 = 노랑
# 세로 2칸, 가로 3칸짜리 컬러 이미지: 모양은 (2, 3, 3)
tiny = np.zeros((2, 3, 3), dtype=np.uint8)
tiny[0, 0] = red
tiny[1, 2] = yellow
print(tiny.shape) # 결과: (2, 3, 3)
print(tiny[1, 2]) # 결과: [ 0 255 255]np.zeros((2, 3, 3), dtype=np.uint8) 은 모든 칸이 0(검정)인 배열을 만듭니다. zeros 는 "0 들"이라는 뜻입니다. 빈 도화지를 먼저 깔고 칸을 칠하는 셈입니다.
주의할 점
- 빛의 색 섞기는 물감과 다릅니다. 빨강과 초록 빛을 섞으면 노랑이 되고, 세 빛을 모두 가득 섞으면 흰색이 됩니다.
- OpenCV 는 색을 BGR(파랑, 초록, 빨강) 순서로 적습니다. 3장에서 RGB 와의 차이를 자세히 봅니다.