컴퓨터 비전 & OpenCV - (1. 기본 영상 처리 개념 및 환경 설정 / 개념 이해 - 전처리 (Preprocessing))
📌 1️⃣ 개념 이해: 영상 처리의 기본 개념
🔹 영상 처리 흐름
영상 처리는 크게 다음과 같은 단계로 진행됩니다.
✅ 2. 전처리 (Preprocessing)
전처리는 영상의 품질을 개선하고, 이후 분석을 원활하게 수행하기 위한 필수적인 과정입니다.
이미지 데이터를 분석하기 전에 적절한 전처리를 수행하면 성능을 향상시키고, 노이즈를 줄이며, 분석 속도를 개선할 수 있습니다.
📌 전처리의 주요 단계
전처리 기법 | 설명 | 사용 예시 |
색상 변환 | 컬러(RGB) ↔ 그레이스케일 변환 | 엣지 검출, 이진화, 물체 검출 |
크기 조정 (Resizing) | 이미지 크기 변경 | 속도 최적화, 해상도 맞춤 |
노이즈 제거 (Denoising) | 필터링 적용하여 노이즈 제거 | 문서 스캔, 얼굴 인식 |
이진화 (Binarization) | 특정 임계값을 기준으로 흑백 변환 | OCR, 객체 탐지 |
📌 1️⃣ 색상 변환 (Color Conversion)
이미지는 보통 컬러(RGB) 로 저장되지만, 분석을 위해 그레이스케일(Grayscale) 변환이 필요한 경우가 많습니다.
그레이스케일 변환은 색상 정보를 제거하고 명암(밝기) 정보만 남기는 과정으로, 연산 속도를 향상시키고 엣지 검출 등에 유리합니다.
🎯 그레이스케일 변환 예제
import cv2
# 이미지 불러오기
img = cv2.imread("image.jpg")
# RGB → 그레이스케일 변환
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 변환된 이미지 출력
cv2.imshow("Grayscale Image", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
✅ RGB → BGR 변환: cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
✅ BGR → Grayscale 변환: cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
📌 2️⃣ 크기 조정 (Resizing)
이미지의 해상도가 너무 크면 연산 속도가 느려질 수 있습니다.
해상도를 적절히 줄이면 처리 속도가 향상되고, 메모리 사용량을 줄일 수 있습니다.
🎯 해상도 변경 (Resize)
# 이미지 크기 조정 (800x600)
resized_img = cv2.resize(img, (800, 600))
cv2.imshow("Resized Image", resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
📌 아스펙트 비율 유지하여 크기 조정
아스펙트 비율(가로세로 비율)을 유지하지 않고 크기를 조정하면 이미지가 찌그러질 수 있습니다.
이를 방지하려면 원본 이미지의 비율을 유지하면서 크기를 변경해야 합니다.
# 원본 이미지 크기 확인
height, width = img.shape[:2]
# 새로운 크기 계산 (너비 500px 기준)
new_width = 500
aspect_ratio = width / height
new_height = int(new_width / aspect_ratio)
# 크기 조정
resized_img = cv2.resize(img, (new_width, new_height))
cv2.imshow("Resized Image", resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
✅ cv2.INTER_LINEAR: 기본적인 선형 보간법 (보통 사용)
✅ cv2.INTER_CUBIC: 고품질 보간법 (이미지 확대 시 유용)
✅ cv2.INTER_LANCZOS4: 가장 높은 품질 제공 (이미지 축소 시 유용)
📌 3️⃣ 노이즈 제거 (Denoising)
이미지에 존재하는 노이즈(Noise) 는 분석을 방해할 수 있으므로 필터링(Filtering) 을 사용하여 제거할 수 있습니다.
🎯 가우시안 블러 (Gaussian Blur) 적용
가우시안 블러는 이미지의 세부 정보를 흐리게 하여 노이즈를 제거하는 방법입니다.
특히, 엣지 검출 및 객체 탐지 전처리 과정에서 유용합니다.
# 가우시안 블러 적용 (커널 크기: 5x5)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
cv2.imshow("Blurred Image", blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
📌 가우시안 블러의 커널 크기
커널 크기 (5, 5) 는 블러링을 적용하는 영역의 크기를 나타냅니다.
- (3,3): 약한 블러 효과
- (5,5): 적절한 노이즈 제거 (보통 사용)
- (7,7) 이상: 더 강한 블러 효과 (세부 정보 손실 가능)
✅ 커널 크기는 홀수여야 하며, 커질수록 블러링 강도가 증가하지만 세부 정보가 사라질 수 있음.
📌 4️⃣ 이진화 (Binarization)
이진화는 이미지를 흑백(0 또는 255)으로 변환하는 과정으로, 객체 탐지, OCR(문자인식) 등에 많이 사용됩니다.
특정 임계값을 기준으로 픽셀 값을 흑(0) 또는 백(255)으로 변환합니다.
🎯 단순 임계값 적용
# 단순 임계값 적용 (Threshold = 127)
_, binary_img = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("Binary Image", binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
✅ cv2.THRESH_BINARY → 임계값 이상은 255(흰색), 미만은 0(검은색)으로 변환
✅ cv2.THRESH_BINARY_INV → 반대 (임계값 이상은 검은색, 미만은 흰색)
📌 적응형 이진화 (Adaptive Thresholding)
일반적인 이진화 방법은 조명 변화가 심한 이미지에서 제대로 동작하지 않을 수 있습니다.
이 경우, 적응형 이진화(Adaptive Thresholding) 를 사용하면 각 영역별로 최적의 임계값을 자동으로 설정할 수 있습니다.
# 적응형 이진화 적용
adaptive_binary = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2
)
cv2.imshow("Adaptive Binary Image", adaptive_binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
📌 블록 크기(11)와 상수(2)의 역할
- 블록 크기 (11): 각 픽셀에 대해 주변 11x11 크기의 영역을 기준으로 임계값 결정
- 상수 (2): 계산된 임계값에서 빼주는 값 (조절하여 밝기 변화 보정 가능)
✅ cv2.ADAPTIVE_THRESH_MEAN_C → 주변 픽셀의 평균값을 기준으로 이진화
✅ cv2.ADAPTIVE_THRESH_GAUSSIAN_C → 가우시안 가중치를 적용하여 이진화 (더 정밀함)
✅ 정리
- 전처리는 영상의 품질을 개선하고 분석을 원활하게 수행하기 위해 필수적인 과정
- 색상 변환 (Grayscale) → 연산 속도 향상, 엣지 검출에 유리
- 크기 조정 (Resizing) → 해상도 조정으로 연산 속도 최적화
- 노이즈 제거 (Filtering) → Gaussian Blur, Median Blur 등 필터 적용
- 이진화 (Binarization) → 이미지의 흑백 변환 (OCR, 객체 탐지 등에 활용)
- 적응형 이진화의 블록 크기와 상수를 조절하여 조명 변화에도 강한 결과 얻기 가능