1장. AI 비전과 OpenCV 개발환경
전처리가 필요한 까닭
김치찌개를 끓일 때 장 봐 온 재료를 그대로 냄비에 넣지 않습니다. 흙을 씻고, 시든 잎을 떼고, 비슷한 크기로 썹니다. 손질을 하면 같은 불로도 맛이 고르게 납니다. AI 모델도 같습니다. 어떤 사진은 어둡고, 어떤 사진은 지글지글한 점(노이즈)이 끼어 있고, 크기도 제각각입니다. 이런 사진을 고르게 다듬는 일이 전처리입니다.
왼쪽은 어둡고 점이 낀 사진, 가운데는 밝기를 올린 사진, 오른쪽은 노이즈까지 줄인 사진입니다. 같은 과일 진열대인데도 오른쪽으로 갈수록 과일의 테두리가 또렷합니다. 여기서 장 봐 온 재료가 찍은 그대로의 사진이고, 씻고 써는 일이 전처리이고, 냄비가 AI 모델입니다.
흔한 문제와 손질법
| 사진의 문제 | 생기는 까닭 | 손질법(전처리) | 배우는 곳 |
|---|---|---|---|
| 너무 어둡거나 밝다 | 조명, 날씨, 카메라 설정 | 밝기·대비 조정, 히스토그램 평활화 | 5장 |
| 지글지글한 점이 많다 | 어두운 곳에서 찍음, 센서의 잡음 | 평균·Gaussian·Median·Bilateral 필터 | 6장, 7장 |
| 크기와 방향이 제각각 | 카메라마다 해상도가 다름 | 크기 바꾸기, 회전, 원근 보정 | 14장 |
| 깨진 파일이 섞여 있다 | 내려받다 끊김, 저장 오류 | 읽기 실패 거르기 | 16장, 이 장의 프로젝트 |
| 사진 수가 적다 | 모으기 힘든 상황 | 뒤집기, 돌리기 같은 데이터 증강 | 16장 |
숫자를 바꾸면 사진이 바뀐다
전처리는 결국 숫자 표의 숫자를 계산으로 바꾸는 일입니다. 밝기를 올리는 것은 모든 칸에 같은 수를 더하는 것입니다.
import numpy as np
import cv2
# 밝기가 50, 120, 250 인 칸 세 개
dark = np.array([[50, 120, 250]], dtype=np.uint8)
# NumPy 로 그냥 더하면 255 를 넘는 칸이 0 부터 다시 돈다(250 + 60 = 310 → 310 - 256 = 54)
print(dark + 60) # 결과: [[110 180 54]]
# cv2.add 는 255 를 넘으면 255 에서 멈춘다(포화 연산)
print(cv2.add(dark, 60)) # 결과: [[110 180 255]]uint8 은 0~255 만 담으므로, 256 이 되면 시계 바늘이 12 를 지나 1 로 돌아가듯 0 으로 돌아갑니다. 그래서 가장 밝던 칸이 갑자기 어두워집니다. cv2.add 는 255 에서 멈추게 계산합니다. 이것을 포화(saturation, 가득 차서 더 들어가지 않음) 연산이라고 합니다.
주의할 점
- 전처리를 지나치게 하면 오히려 정보를 지웁니다. 노이즈를 너무 세게 지우면 흠집까지 함께 사라집니다.
- 학습할 때 한 전처리는 실제로 쓸 때도 똑같이 해야 합니다. 학습은 밝게 다듬은 사진으로 하고 실제로는 어두운 사진을 넣으면 모델이 헷갈립니다.