디지털 이미지의 구조

1. 픽셀(Pixel)

  • 정의: 디지털 이미지의 가장 기본적인 단위. ‘그림 요소(Picture Element)’의 줄임말
  • 구성: 각 픽셀은 하나의 색상 값을 가지며, 이미지는 이러한 픽셀들의 2차원 배열로 구성
  • 좌표 시스템 (OpenCV 기준)
    • 좌상단이 원점(0,0)
    • 오른쪽으로 갈수록 x값 증가
    • 아래로 갈수록 y값 증가

2. 이미지 해상도

  • 정의
    • 가로×세로 픽셀 수로 표현
    • 예: 640×480 해상도는 가로 640픽셀, 세로 480픽셀을 의미
  • 중요성
    • 해상도가 높을수록 세밀한 정보를 담을 수 있음
    • 해상도가 높아질 수록 처리 시간과 메모리 사용량 증가

3. 색상 공간(Color Space)

  • 그레이스케일(Grayscale)
    • 구조
      • 각 픽셀이 0(검은색)부터 255(흰색)까지의 단일 값을 가짐
    • 표현
      • 8비트(1바이트)로 표현됨
      • 256단계의 명암을 표현할 수 있음
    • 용도: 윤곽선 검출, 형태 분석 등 색상 정보가 중요하지 않은 경우에 사용됨
  • RGB 색상 모델
    • 구조
      • 각 픽셀이 Red(빨강), Green(초록), Blue(파랑) 세 가지 색상 채널의 값을 가짐
    • 표현
      • 일반적으로 채널당 8비트를 사용하여 각 채널이 0~255 사이의 값을 가짐
      • 총 24비트(3바이트)로 약 1,680만 색상을 표현할 수 있음
    • 순서: OpenCV에서는 기본적으로 BGR 순서로 채널 저장(일반적인 RGB와 반대)
    • 용도: 자연색 이미지 처리, 객체 인식 등 색상 정보가 중요한 작업에 사용됨
  • HSV/HSL 색상 모델
    • 구성 요소:
      • Hue(색상): 0~179(OpenCV에서)의 값으로 색상의 종류를 나타냄
      • Saturation(채도): 0~255의 값으로 색상의 순수도를 나타냄
      • Value/Lightness(명도): 0~255의 값으로 색상의 밝기를 나타냄
    • 장점: 인간의 색상 인식 방식과 유사하여 색상 기반 분할에 유용
    • 용도: 특정 색상 영역 추출, 조명 변화에 강인한 처리가 필요할 때 사용

4. 이미지 데이터 구조

  • NumPy 배열 형태
    • OpenCV에서의 표현
      • 이미지는 NumPy 배열(ndarray)로 표현됨
    • 차원:
      • 그레이스케일: 2차원 배열 (높이 × 너비)
      • 컬러 이미지: 3차원 배열 (높이 × 너비 × 채널 수)
    • 접근 방식
      1. image[y, x]로 그레이스케일 픽셀에 접근
      2. image[y, x, channel]로 컬러 이미지의 특정 채널 값에 접근
  • 데이터 타입
    • 일반적 타입: uint8(8비트 부호 없는 정수, 0~255)
    • 고정밀 처리용: float32, float64 등 (0.0~1.0 범위로 정규화하여 사용)
    • 특수 목적: int16, int32 등 (연산 과정에서 오버플로우 방지)

5. 이미지 파일 형식과 메모리 구조

  • 파일 형식
    • 압축 방식:
      • 무손실 압축: PNG, BMP, TIFF 등
      • 손실 압축: JPEG 등
    • 채널 지원:
      • 알파 채널(투명도) 지원: PNG, TIFF
      • 알파 채널 미지원: JPEG
  • 메모리 내 구조
    • 연속성(Continuity): OpenCV의 이미지는 기본적으로 메모리에 연속적으로 저장됨
    • 행 우선 저장: 픽셀 데이터는 행(row) 단위로 메모리에 연속적으로 저장됨
    • 패딩(Padding): 메모리 접근 최적화를 위해 각 행의 끝에 추가 바이트가 삽입될 수 있음

6. ROI(Region of Interest)

  • 정의: 이미지에서 관심 있는 특정 영역을 의미
  • 표현 방식
    • OpenCV에서는 슬라이싱을 통해 쉽게 ROI를 추출할 수 있음
    roi = image[y:y+h, x:x+w]  # (x,y)부터 너비 w, 높이 h 영역
    

7. 이미지 처리를 위한 중요 개념

  • 채널 분리와 병합
    • 분리: b, g, r = cv2.split(image)로 각 채널 분리
    • 병합: merged = cv2.merge([b, g, r])로 채널을 다시 병합
  • 이미지 연산
    • 픽셀 단위 연산: 덧셈, 뺄셈, 곱셈 등의 연산이 픽셀 단위로 수행됨
  • 마스킹(Masking)
    • 정의: 특정 영역만 선택적으로 처리하거나 제외하기 위해 사용하는 이진(binary) 이미지
    • 활용
      • 이미지에서 특정 객체만 추출하거나, 특정 배경을 제거할 때 사용
      • 마스크는 주로 그레이스케일 이미지 형태로, 관심 영역은 255(흰색), 제외 영역은 0(검은색)으로 표현됨
      # 예: 원본 이미지에서 마스크 영역만 추출
      masked_image = cv2.bitwise_and(original_image, original_image, mask=binary_mask)
      
  • 이미지 크기 조정 (Resizing)
    • 정의: 이미지의 가로 및 세로 픽셀 수를 변경하는 작업
    • 메서드
      • cv2.resize() 함수 사용
      • 인터폴레이션(보간법) 방법을 지정할 수 있음
        • cv2.INTER_LINEAR: 선형 보간 (기본값, 속도와 품질 적당)
        • cv2.INTER_AREA: 영역 보간 (이미지 축소에 적합)
        • cv2.INTER_CUBIC: 큐빅 보간 (이미지 확대에 적합, 고품질)
    • 용도
      • 딥러닝 모델 입력 크기 통일, 처리 속도 향상, 메모리 절약 등에 사용
  • 이미지 회전 및 변환
    • 회전(Rotation)
      1. cv2.rotate() 함수나 회전 매트릭스 생성
      2. cv2.warpAffine() 함수를 통해 이미지를 특정 각도로 회전
    • 투시 변환(Perspective Transform)
      • 이미지의 원근감을 변경하여 평면상의 객체를 다른 시점에서 보는 것처럼 변환
      • cv2.getPerspectiveTransform()cv2.warpPerspective() 사용
      • 자율주행에서는 조감도(Bird’s Eye View)를 얻거나 차선 인식 등에 활용됨
    • 어파인 변환(Affine Transform)
      • 평행 이동, 회전, 크기 조절, 기울임 등 이미지의 형태를 유지하면서 변환
      • cv2.getAffineTransform()cv2.warpAffine() 사용
  • 색상 공간 변환
    • 정의: 이미지의 색상 모델을 변경하는 작업
    • 함수:
      • cv2.cvtColor() 함수 사용
      • 변환 코드를 지정함
        • RGB BGR: cv2.COLOR_RGB2BGR, cv2.COLOR_BGR2RGB
        • BGR 그레이스케일: cv2.COLOR_BGR2GRAY
        • BGR HSV: cv2.COLOR_BGR2HSV
    • 활용
      • 그레이스케일 변환: 처리 속도 향상 및 색상 정보가 불필요한 경우에 유용
      • HSV 변환: 특정 색상 범위 추출(예: 초록색 신호등, 노란색 차선)에 유용