해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.
※ 픽셀 데이터와 영상 정보
1. 영상의 구조
영상의 기본적인 구조는 2차원 행 우선 배열로 좌표 (x,y)에 대하여 배열[y][x]로 나타낼 수 있다.
- 회색조 영상 : 위 그림은 BYTE g[4][8] 픽셀 배열 안에 회색조 영상 데이터를 넣은 것이다.
- 컬러 영상 : 위 그림은 BYTE c[4][20]에 B->G->R 순서로 채널 값이 저장되는 예이다.
- 위 예를 보면 'x' 표시로 된 사용하지 않는 의사(dummy) 데이터가 있다. 32bit의 경우 4의 배수 byte, 64bit의 경우 8의 배수 byte로 배열을 만들어 영상이 비트맵과 같은 형태의 파일로 저장될 때를 비롯해서 영상을 파일로부터 읽거나 쓸 때 전체 픽셀 데이터를 한 덩어리로 보고 한꺼번에 파일로부터 읽거나 쓰기 때문에 데이터를 효율적으로 처리할 수 있다.
- 영상의 1차원 배열 표현
: 영상을 2차원 배열로 사용하게 되면 원소를 접근하는 데 더 많은 오버헤드(시스템에서 목적으로 하는 효과를 얻는데 본질적인 것은 아니지만 추가로 요구되는 작동)가 소요되기 때문에, 프로그램 동작 속도 측면에서는 1차원 배열이 훨씬 더 효율적이고, 우리가 하는 예제에서도 1차원 배열로 표현할 예정이다.
위에서의 2차원 픽셀 배열을 1차원으로 바꾸면 위와 같이 된다.
ex2) 영상의 정보
: CMyImage 클래스는 픽셀 데이터 외에도 영상 규격 정보(영상 세로/가로 크기, 채널 수, 한 행당 바이트 수 등)을 가진다.
protected: int m_nChannels; // 채널 수 int m_nHeight; // 세로 픽셀 수 int m_nWidth; // 가로 픽셀 수 int m_nWStep; // 행당 데이터 원소 수 T* m_pImageData; // 픽셀 배열 포인터
m_nWStep = ((m_nWidth*m_nChannels*sizeof(T)+3)&~3)/sizeof(T);
행당 데이터 원소 수는 (가로 픽셀 수) * (채널 수)로도 구할 수 있지만 한 행당 바이트 수가 4byte의 배수가 되도록 해야되기 때문에 위 코드와 같이 할수 있다. 위에서 3을 더해주는 이유는 자기 자신보다 크거나 같은 4의 배수 이상의 값을 갖도록 하기 위해서다. '~3' 즉, 3의 보수를 AND 연산해주는 이유는 '11111111 11111111 11111111 11111100'과 AND 연산을 하면 무조건 4의 배수가 되기 때문이다. 그리고 sizeof(T)를 나누어 주면 행당 데이터 원소수를 구할 수 있다.
public: int GetChannel() const { return m_nChannels; } int GetHeight() const { return m_nHeight; } int GetWidth() const { return m_nWidth; } int GetWStep() const { return m_nWStep; } T* GetPtr(int r = 0, int c = 0) const { return m_pImageData + r*m_nWStep + c }
멤버 변수를 protected로 선언했기에 getter 함수를 정의했다. getter 함수가 호출되는 동안 멤버 변수의 값을 변경할 수 없도록 const예약어를 붙였고, const 예약어를 통해 CMyImage 클래스의 const 객체가 const 함수에만 접근할 수 있다.
GetPtr 함수는 영상 픽셀 데이터 특정 위치의 포인터를 반환한다. 실제 프로그램을 작성할 시 행과 열을 각각 입력하지 않고 1차원 배열이기 때문에 행단위로 포인터를 획득하는 경우가 많아서 변수 c의 기본값을 0으로 설정해 입력하지 않아도 되도록 했다. 또한 변수 r을 0으로 설정해 영상 데이터 포인터의 처음 위치를 얻고자 할 때는 매개변수를 입력하지 않아도 된다.
'영상처리 프로그래밍' 카테고리의 다른 글
영상 데이터 클래스 구현(4) (0) | 2017.06.04 |
---|---|
영상 데이터 클래스 구현(3) (0) | 2017.06.04 |
영상 데이터 클래스 구현(1) (0) | 2017.06.04 |
기타 MFC (0) | 2017.06.04 |
영상 처리 프로그래밍 시작/기초 (0) | 2017.06.04 |