해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.



※ 픽셀 데이터와 영상 정보

 

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

+ Recent posts