AI/영상

컴퓨터 비전 & OpenCV - (1. 기본 영상 처리 개념 및 환경 설정 / 개념 이해 - 전처리 (Preprocessing))

개발_노트 2025. 3. 14. 23:21

📌 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, 객체 탐지 등에 활용)
  • 적응형 이진화의 블록 크기와 상수를 조절하여 조명 변화에도 강한 결과 얻기 가능