영상 데이터 구조와 표현 방법

강형우·2022년 11월 27일
0

OpenCV

목록 보기
6/17

영상 데이터 구조와 특징

  • 영상(Image)이란?

    • 픽셀이 바둑판 모양의 격자에 나열되어 있는 형태(2차원 행렬)
    • 픽셀: 영상의 기본 단위, 화소, picture element
  • 그림은 카메라에 있는 센서이다. 센서는 광학적 신호를 전기적인 신호로 변화시켜줌.

  • 빨간색, 녹색 ,파란색에 대한 정보가 따로 취합된다.

  • 우리 눈으로 볼 땐 취합된 정보로 보임

  • 그레이스케일 영상(Grayscale Image)

    • 흑백 사진처럼 색상 정보가 없이 오직 밝기 정보로만으로 구성된 영상
    • 밝기 정보256단계로 표현
  • 트루컬러 영상(Truecolor Image)

    • 컬러 사진처럼 다양한 색상을 표현할 수 있는 영상
    • Red, Green, Blue 색 성분을 각각 256단계로 표현 -> 256^3=16,777,216색상 표현 가능
  • 그레이스케일 영상의 픽셀 값 표현

    • 그레이스케일 영상에서 하나의 픽셀은 0~255 사이의 정수 값을 가짐.
    • 그레이스케일 범위(Grayscale level):[0,255] 또는 [0,256)
    • 보통 대괄호는 정수값을 포함, 소괄호는 그 값을 포함하지 않는다는것을 표현
  • C/C++ 에서 unsigned char로 표현(1Byte)

  • 트루컬러 영상의 필셀 값 표현

    • R, G, B 색 성분의 크기를 각각 0~255 범위의 정수로 표현
      - 0: 해당 색상 성분이 전혀 없는 상태
      - 255: 해당 색상 성분이 가득 있는 상태
    • C/C++에서 표현 방법
      • unsigned char 자료형 3개 있는 배열 또는 구조체
      • 3Bytes 사용
      • e.g)
  • 영상에서 사용되는 좌표계

    • 가로크기 w, 세로크기 h
      (0,0)......(w-1,0)
      ..
      ..
      ..
      (0,h-1)......(w-1,h-1)
    • 영상에서의 표현과 행렬에서의 표현은 반대가 됨
    • 영상에서는 가로크기를 먼저 쓰고 세로 크기를 쓰는데 반해
    • 행렬을 표현할때는 세로 크기를 먼저 쓰고 가로 크기를 나중에 쓰는 형태이기 때문
  • 그레이스케일 영상에서 픽셀 값 분포의 예

  • 트루컬러 영상에서 픽셀 값 분포의 예

영상 데이터 표현 방법

  • 정적 2차원 배열의 생성

  • {}는 초기값을 Default로 설정하기 위해; 모든 원소값은 0으로 초기화 된다.

  • unsigned char: 1바이트 사용(0~255 사이의 정수 표현)

  • 2차원 배열 전체 크기만큼의 메모리 공간이 연속적으로 할당됨 (640x480=307200바이트)

  • 단점

    • 배열의 크기를 미리 알고 있어야 함 -> 다양한 크기의 영상을 표현하기에 부적절
    • Stack 영역에 메모리 할당: 대략 1MB까지 할당 가능
  • 동적 2차원 배열의 생성

    • 행 단위로만 연속된 메모리 공간이 보장됨
    • 프로그램 동작 중 다양한 크기의 영상을 생성할 수 있음
    • Heap영역에 메모리 할당: x86의 경우 2GB까지 할당 가능(x64의 경우 8TB)
  • 동적 2차원 배열 생성 코드의 동작

    2.

  • 동적 2차원 배열의 원소에 접근하는 방법

    • 2차원 배열 p의 모든 원소 값을 10씩 증가하기
      for(int y = 0; y < h; y++)
      {
          for(int x = 0; x < w; x++)
          {
              p[y][x] = p[y][x] + 10;
          }
      }
  • 동적 2차원 배열의 메모리 해제

    • 동적 2차원 배열 생성의 역순으로 해제
    • delete 구문에서 괄호 연산자([])를 반드시 사용
    for(int y=0;y<h;y++)
        delete[] p[i];
    delete[] p;
    • 마지막 delete문은 이 부분을 없애기 위해서
  • 대용량 1차원 메모리 할당 후 영상 데이터 저장하기

    • 2차원 배열이 아닌 1차원 배열에 영상의 픽셀 값을 차례대로 저장하여 사용
    • x 좌표가 4이고, y 좌표가 6인 위치에 접근하고 싶으면, data+6*w에서 옆으로 4칸 가는 형태로 접근가능
  • 간단한 형태의 영상 데이터 저장 클래스

    • w와 h는 영상의 가로와 세로를 저장할 변수
    • data는 픽셀데이터를 저장하기 위해서 동적할당한 메모리 공간의 시작주소를 가르킬 포인터 변수
    • MyImage()의 디폴트 생성자: w,h를 다 0으로 초기화, 포인터변수 데이터도 0으로 초기화
    • MyImage()의 생성자: 2개의 정수값을 받는 형태의 생성자, data라는 포인터 변수는
      data = new unsigned char[w * h] {};로 데이터 공간을 할당하고, 시작주소를 데이터가 가리키도록 설정
    • MyImage()의 소멸자: 메모리 할당이 있었으면, 해당 메모리를 해제함
    • at(int x, int y): at이라는 함수를 이용해서 x,y에 있는 픽셀 값을 반환을 하도록 함. 참조로 반환을 해서 해당 픽셀값을 읽어올 뿐만 아니라 픽셀값을 설정을 할 수도 있도록 만듦

0개의 댓글