IDL/New Graphics

VOLUME 함수의 활용 [1]

이상우_IDL 2013. 7. 9. 16:39
728x90

최근에 IDL이 8.2.3 버전으로 업데이트되었는데, 새롭게 보강된 기능들 중에서 가장 눈에 띄는 것은 VOLUME이라는 그래픽 함수입니다. 8.0부터 도입되었던 New Graphics 체계의 여러 그래픽 기능들 중에서 가장 나중에서야 포함된 기능으로서, 3차원 격자자료를 복셀(Voxel) 기반의 볼륨(Volume)으로 가시화하는 역할을 합니다. 약 2회 정도에 걸쳐서 이 VOLUME 함수에 관한 내용을 다뤄보기로 하겠습니다.


사실 3차원 볼륨 자료를 가시화하는 것은 기존의 IDL에서도 Object Graphics 체계에서 얼마든지 가능했었습니다. 다만 이 방법이나 과정이 누구나 쉽게 사용할만한 것은 아니어서 많은 사용자들에게 권장하기가 어려운 감이 있었는데요. 이번에 도입된 VOLUME 함수를 사용하면 매우 쉽게 3차원 볼륨 자료를 가시화할 수 있게 되었습니다. 설명을 위한 예제 자료는 IDL의 설치 디렉토리에서 examples/data에 head.dat라는 파일을 사용합니다. 바이너리 형식으로 된 이 파일에는 80X100X57의 3차원 격자 자료가 저장되어 있는데, 다음과 같이 READ_BINARY 함수를 사용하여 읽어오면 됩니다.


file = FILEPATH('head.dat', SUBDIRECTORY = ['examples', 'data'])

data = READ_BINARY(file, DATA_DIMS=[80, 100, 57])

PRINT, MIN(data), MAX(data)



그 다음은 간단합니다. 다음과 같이 VOLUME 함수를 사용하면 됩니다. 그러면 다음 그림과 같이 3차원 공간상에 구현된 3차원 볼륨 자료의 모습을 볼 수 있습니다. 이것은 NG체계에서 구현된 다른 그래픽 개체들과 마찬가지로 3차원 공간상에 구현된 상태이기 때문에 마우스 포인터를 드래그하여 이리저리 회전해볼 수도 있습니다.


win = WINDOW(DIMENSIONS=[600, 600])

vol = VOLUME(data, /CURRENT)


참고로 이 3차원 격자자료는 사람의 머리를 스캔한 자료인데요. 구현된 그래픽을 보면 X, Y, Z 축의 상대적 비율이 약간 안맞는 것처럼 보입니다. 머리가 너무 납작한 느낌이 있는데요. 격자의 크기에 맞도록 비율을 맞춰주려면 다음과 같이 ASPECT_RATIO라는 속성의 값을 1로 주면, 다음 그림과 같이 3개 축 방향의 길이 비율이 맞도록 표시가 됩니다.



3차원 격자 자료상의 최소 단위인 각각의 점을 복셀(Voxel)이라고 합니다. 참고로, 2차원 이미지 자료상의 최소 단위인 각각의 점을 픽셀(Pixel)이라고 부르는데, 복셀은 픽셀의 3차원 버전인 셈입니다. 현재 사용중인 자료의 복셀값들은 0~232의 범위를 갖고 있습니다. 이미지의 픽셀의 색상을 컬러테이블로 조절하는 것처럼, 볼륨의 복셀의 색상도 컬러테이블로 조절할 수 있습니다. 이를 위해서는 RGB_TABLE0라는 속성이 사용됩니다. 원래는 다음과 같이 속성만 바꿔줘도 볼륨의 컬러테이블이 바뀌는게 맞습니다.


ct = 34

vol.RGB_TABLE0 = ct


하지만, 버그인지 모르겠으나 볼륨의 컬러테이블 속성을 나중에 바꿔도 반영이 안되더군요. 따라서 아직까지는 다음과 같이 그냥 볼륨을 처음 구현할 때 이 러테이블 속성을 부여해야만 제대로 색상이 반영됩니다.


vol.Erase

vol = VOLUME(data, RGB_TABLE0=ct, ASPECT_RATIO=1, /CURRENT)



그 외에도 VOLUME 함수에는 많은 속성 및 메서드들이 존재합니다. 자세한 내용은 IDL 도움말을 살펴보면 됩니다. 물론 이 볼륨이라는 가시화 방법 자체가 근본적으로는 3차원 객체 지향 그래픽에 기반을 둔 것이기 때문에, 어떤 속성들은 이러한 기반 지식이 있어야 이해가 갈만한 것들도 있는 것이 사실입니다. 하지만, 이번에 NG 체계에서 도입된 VOLUME 함수 덕분에 3차원 볼륨 자료의 가시화가 많이 간편해진 것만은 분명해 보입니다. 다음 시간에는 3차원 볼륨 자료의 단면도를 얻는 방법을 알아보기로 하겠습니다.


LIST