더북(TheBook)

6.1.1 IppImage 클래스를 이용한 픽셀 값 접근 방법

영상을 반전하는 방법을 배우기에 앞서, 먼저 영상에서 각각의 픽셀에 접근하여 값을 변경하는 방법에 대하여 알아보자. 왜냐하면 영상을 반전한다는 것은 영상 내의 모든 픽셀 값을 반전한다는 것과 동일한 의미이기 때문이다.

ImageTool 프로그램의 도큐먼트 클래스인 CImageToolDocIppDib 클래스의 객체를 멤버 변수로 가지고 있다. 그러나 IppDib 클래스는 비트맵 영상의 픽셀 정보를 변경하는 기능을 제공하지 않는다. 그러므로 실제 영상 처리를 위해서는 IppDib 클래스를 이용할 수 없고, 픽셀 값 변경이 가능한 IppImage 클래스로 변환해야 한다. 예를 들어 현재 다루고 있는 영상이 그레이스케일 비트맵이라면 IppDib 클래스를 IppByteImage로 변환한 후 영상 처리를 수행해야 한다. 만약 트루컬러 비트맵을 다룰 경우에는 IppDib 클래스를 IppRgbImage로 변환한 후 영상 처리를 수행해야 한다.

일단 그레이스케일 비트맵에 대해 영상 처리를 수행하는 방법에 대해 알아보자. CImageToolDoc 클래스에서 IppDib 타입의 멤버 변수 이름이 m_Dib이므로 실제 변환 코드는 아래와 같은 형태를 따른다.

IppByteImage img;
IppDibToImage(m_Dib, img);

IppByteImage 클래스로 변환한 후에는 IppImage 클래스에서 제공하는 픽셀 값 접근 멤버 함수를 사용할 수 있다. IppImage 클래스는 픽셀 값에 접근할 수 있는 두 개의 멤버 함수 GetPixelsGetPixels2D를 제공한다. GetPixels 함수는 영상의 픽셀 데이터를 1차원 배열 형태로 접근할 수 있는 방법을 제공하고, GetPixels2D 함수는 2차원 배열 형태로 접근할 수 있는 방법을 제공한다.

먼저 모든 픽셀을 1차원 배열처럼 사용할 수 있게 해주는 GetPixels 함수 사용을 알아보자. imgIppByteImage 타입이라고 가정하고, 아래와 같이 코드를 작성하면 BYTE 타입의 포인터를 얻을 수 있다.

int size = img.GetSize();
BYTE* p1 = img.GetPixels();

for (int i = 0; i < size; i++)
{
    // p1[i] : i번째 픽셀 값.
}

일단 GetPixels 함수에 의해 BYTE* p1이 설정되면 p1을 1차원 배열처럼 사용할 수 있다. 즉, 영상에서 맨 처음 픽셀은 p1[0]으로 접근할 수 있고, 맨 마지막 픽셀은 p1[size - 1] 형태로 접근할 수 있다. size 변수는 영상의 전체 픽셀 개수를 의미한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.