더북(TheBook)

4.3.2 다양한 자료형 지원(템플릿 클래스)

영상 처리에서 주로 사용하는 영상은 그레이스케일 영상과 트루컬러 영상이다. 그레이스케일 영상의 한 픽셀은 보통 unsigned char 자료형으로 표현하며, unsigned char 타입은 Windows에서 BYTE라는 이름으로 사용한다. 트루컬러 영상은 하나의 픽셀이 R, G, B 색상 성분을 가지며 각각의 색 성분은 0~255 범위를 갖는다. 그러므로 트루컬러 영상의 한 픽셀은 3바이트로 표현이 가능하며, 이 책에서는 3바이트의 크기를 갖는 새로운 자료형 RGBBYTE를 이용하여 색상을 표현할 것이다(RGBBYTE는 4.3절 뒷부분에서 설명한다.). 즉, 영상 처리를 위해서는 BYTE 타입으로 만든 영상 클래스와 RGBBYTE 타입으로 만든 영상 클래스가 필요하다.

다만 경우에 따라 BYTERGBBYTE가 아닌 다른 자료형의 영상 표현이 필요한 경우가 있다. 예를 들어 영상 내부에 존재하는 여러 객체에 대해 번호를 붙이는 레이블링labeling의 경우, 255개보다 많은 객체의 개수를 세기 위해서는 BYTE 대신 int 자료형을 이용해야 한다. 또한 내부적으로 정교한 연산을 수행하기 위해서는 정수가 아닌 실수 연산이 필요한 경우가 있는데, 이런 경우에는 float 또는 double 자료형으로 구성된 영상을 만들어야 한다.

이처럼 다양한 자료형의 영상을 지원하기 위해서는 C++의 템플릿 클래스 형태로 영상 표현 클래스를 만들면 유용하다. 즉, IppImage 클래스의 정의를 다음과 같은 형태로 만들면 여러 자료형에 대한 영상 클래스를 쉽게 만들 수 있다.

template<typename T> class IppImage
{
// ...
private:
    int width;
    int height;
    T** pixels;
};

IppImage 클래스는 영상의 가로 크기, 세로 크기를 지정하는 widthheight 멤버 변수를 가지고 있고, 픽셀 데이터를 가리킬 2차원 포인터 타입의 변수 pixels를 가지고 있다. 이때 픽셀 데이터를 표현하는 자료형이 T로 되어 있기 때문에 이 템플릿 클래스를 어떻게 정의하냐에 따라 다양한 자료형의 영상을 만들 수 있다. 다음은 다양한 자료형을 이용하여 만든 IppImage 클래스 객체들이다.

IppImage<BYTE>     img1; // 일반적인 그레이스케일 영상
IppImage<int>      img2; // 정수형 영상
IppImage<float>    img3; // 실수형 영상
IppImage<double>   img4; // 정밀한 실수형 영상
IppImage<RGBBYTE>  img5; // 트루컬러 영상

위에서 RGBBYTE는 트루컬러 영상의 R, G, B 색상 정보를 표현하기 위한 3바이트 크기의 클래스로써 이 절의 마지막 부분에서 설명할 것이다. 위와 같은 형태로 다양한 자료형에 대한 IppImage 객체를 선언하여 사용할 수 있지만, 다소 자료형 이름이 너무 길어지고 복잡해 보이는 감이 있다. 그러므로 자주 사용되는 자료형에 대한 IppImage 클래스 타입에 대해서는 아래와 같이 typedef 문으로 정의하여 사용하면 편리하다.

typedef IppImage<BYTE> IppByteImage;
• typedef IppImage<int> IppIntImage;
• typedef IppImage<float> IppFloatImage;
• typedef IppImage<double> IppDoubleImage;
• typedef IppImage<RGBBYTE> IppRgbImage;

위와 같이 typedef를 이용하여 IppImage의 새 이름들을 정의하면 앞서 img1부터 img5까지 영상의 선언을 다음과 같이 쓸 수 있다.

IppByteImage    img1;  // 일반적인 그레이스케일 영상
IppIntImage     img2;  // 정수형 영상
IppFloatImage   img3;  // 실수형 영상
IppDoubleImage  img4;  // 정교한 실수형 영상
IppRgbImage     img5;  // 트루컬러 영상
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.