더북(TheBook)

그렇다면 언제 GetPixels 함수를 사용하고 언제 GetPixels2D 함수를 사용해야 할까? 일단 프로그램 동작 속도 측면에서는 GetPixels 함수를 사용하여 1차원 배열처럼 픽셀을 다루는 것이 유리하다. GetPixels2D 함수를 사용하면 이중 for 루프 안에서 2차원 배열처럼 픽셀 값에 접근하는데, 이 경우 두 번의 포인터 주소 연산이 필요하다. 이 때문에 GetPixels2D 함수를 사용하는 방식이 GetPixels 함수 사용 방식보다 조금 느리다. 다만 영상 처리 알고리즘이 각각의 픽셀 자신의 값만을 이용하는 것보다 자기 자신의 주변 픽셀들과의 상관 관계를 같이 고려하는 경우가 많은데, 이러한 경우에는 GetPixels2D 함수를 사용하는 것이 코드 가독성 입장에서 유리하다. 이 책에서는 영상 처리 알고리즘의 성격에 따라 GetPixels 함수와 GetPixels2D 함수를 적절하게 혼용하여 사용할 것이다.

IppImage 클래스를 이용한 영상 처리 작업 후, IppImage 타입의 영상을 화면에 보여주려면 결과 영상을 다시 IppDib 클래스로 변환해주어야 한다. 만약 결과 영상이 img 변수에 저장되어 있고, 이를 새로운 IppDib 객체에 복사하고 싶다면 코드를 아래와 같이 작성하면 된다.

IppDib dib;
IppImageToDib(img, dib);

AfxNewBitmap(dib);

앞의 코드에서 IppImageToDib 함수는 imgIppDib 타입의 변수 dib로 복사한다. AfxNewBitmap 함수는 5장에서 만든 전역 함수로서 dib 비트맵 영상을 새 창으로 띄워주는 동작을 한다.

지금까지는 img 영상이 모두 BYTE 타입의 영상, 즉 IppByteImage 클래스 타입이라고 가정하여 설명하였기 때문에 GetPixels 또는 GetPixels2D 함수는 BYTE* 또는 BYTE** 타입을 반환하였다. 그러나 트루컬러 비트맵을 다룰 경우 IppDib 클래스는 IppRgbImage 클래스로 변환될 것이고, 이 경우 GetPixels 또는 GetPixesl2D 함수를 호출하면 RGBBYTE* 또는 RGBBYTE** 타입을 반환할 것이다. 트루컬러 영상의 픽셀 값 제어에 대해서는 이 책의 12장에서 다시 자세히 다룰 것이다.

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