OpenCV 기초 사용법

설치

# OpenCV 설치
pip install opencv-python

기본 사용법

1. 이미지 읽기

import cv2

# 이미지 읽기 (BGR 형식으로 로드됨)
# ⚠️ 주의: OpenCV는 RGB가 아닌 BGR(Blue, Green, Red) 순서를 사용합니다
img = cv2.imread('image.jpg')

# 그레이스케일로 읽기
img_gray = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 이미지가 제대로 로드되었는지 확인
if img is None:
    print("이미지를 읽을 수 없습니다")

2. 이미지 표시

# 이미지 표시
cv2.imshow('Image', img)

# 키 입력 대기 (0은 무한 대기, 숫자는 밀리초)
cv2.waitKey(0)

# 모든 창 닫기
cv2.destroyAllWindows()

3. 이미지 저장

# 이미지 저장
cv2.imwrite('output.jpg', img)

# 품질 설정 (JPEG의 경우, 0-100)
cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 95])

4. 이미지 속성 확인

# 이미지 크기 (높이, 너비, 채널)
height, width, channels = img.shape
print(f"크기: {width}x{height}, 채널: {channels}")

# 이미지 데이터 타입
print(f"데이터 타입: {img.dtype}")

# 이미지 크기 (픽셀 수)
print(f"픽셀 수: {img.size}")

5. 이미지 데이터 타입 변환

주요 데이터 타입 (dtype):

  • uint8: 0-255 범위의 8비트 부호 없는 정수 (가장 일반적, JPEG/PNG 이미지)
  • uint16: 0-65535 범위의 16비트 부호 없는 정수 (고해상도 이미지)
  • float32: 32비트 부동소수점 (0.0-1.0 또는 0.0-255.0 범위)
  • float64: 64비트 부동소수점 (더 높은 정밀도)

타입 변환이 필요한 이유:

  1. 수학 연산의 정밀도: uint8은 정수만 표현하므로 나눗셈, 곱셈 등 연산 시 정밀도 손실 발생
  2. 음수 값 처리: 일부 연산(차분, 필터링)에서 음수 값이 발생할 수 있어 float 타입 필요
  3. 값 범위 초과: 연산 결과가 255를 초과하거나 0 미만이 될 수 있음
  4. 다른 라이브러리 호환: PyTorch, TensorFlow 등은 float32를 기본으로 사용
  5. 정규화: 머신러닝 모델은 보통 0.0-1.0 범위의 정규화된 값을 요구
import numpy as np

# uint8 → float32 변환 (0.0-1.0 범위로 정규화)
img_float = img.astype(np.float32) / 255.0

# float32 → uint8 변환 (0-255 범위로 복원)
img_uint8 = (img_float * 255).astype(np.uint8)

# uint8 → float32 변환 (0.0-255.0 범위 유지)
img_float_255 = img.astype(np.float32)

# float32 → uint8 변환 (클리핑 포함)
img_clipped = np.clip(img_float_255, 0, 255).astype(np.uint8)

# uint16 → uint8 변환 (스케일링)
img_uint16 = cv2.imread('high_res.jpg', cv2.IMREAD_UNCHANGED)
img_uint8_from_16 = (img_uint16 / 256).astype(np.uint8)

6. 이미지 크기 조정

# 특정 크기로 조정
resized = cv2.resize(img, (800, 600))

# 비율 유지하며 조정
scale = 0.5
resized = cv2.resize(img, None, fx=scale, fy=scale)

# 보간 방법 지정
resized = cv2.resize(img, (800, 600), interpolation=cv2.INTER_LINEAR)

7. 이미지 회전

# 90도 회전
rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

# 특정 각도로 회전
import numpy as np

height, width = img.shape[:2]
center = (width // 2, height // 2)
angle = 45
scale = 1.0

matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated = cv2.warpAffine(img, matrix, (width, height))

8. 색상 공간 변환

⚠️ 중요: OpenCV는 기본적으로 BGR(Blue, Green, Red) 형식을 사용합니다

  • 대부분의 라이브러리(PIL, matplotlib 등)는 RGB를 사용하지만, OpenCV는 BGR을 사용
  • 다른 라이브러리와 함께 사용할 때는 색상 순서 변환이 필요합니다
# BGR to RGB (다른 라이브러리와 호환을 위해)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# BGR to Grayscale
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# BGR to HSV
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

9. 이미지 그리기

⚠️ 색상 값은 BGR 순서로 지정합니다: (Blue, Green, Red)

# 선 그리기 (색상: (B, G, R) = (0, 255, 0) = 녹색)
cv2.line(img, (0, 0), (100, 100), (0, 255, 0), 2)

# 사각형 그리기 (색상: (255, 0, 0) = 파란색)
cv2.rectangle(img, (50, 50), (200, 200), (255, 0, 0), 2)

# 원 그리기 (색상: (0, 0, 255) = 빨간색)
cv2.circle(img, (100, 100), 50, (0, 0, 255), 2)

# 텍스트 추가 (색상: (255, 255, 255) = 흰색)
cv2.putText(img, 'Hello', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)