New Graphics의 Volume 데이터 가시화

얼마전 에스이랩의 김일석 선수가 만든 한장강의(Object Graphics와 볼륨 자료 처리)는 오브젝트 그래픽스의 표준적인 사용법을 이용하여 3차원 배열의 볼륨 데이터를 가시화하는 방법을 설명합니다. IDL 오브젝트 그래픽스라는 체계에 익숙해지면, 이러한 방식이 절대 어려운 것은 아닙니다. 생각했던 것 만큼 번거롭지도 않고요. Polygon, Surface, Image 등이 하나의 체계로 통일되어 있기 때문에, 익숙해진다면 “이것 참 좋네” 하는 생각이 드는 것은 사실입니다. 그렇지만 “익숙해진다면”이 장벽입니다. Direct Graphics의 간편함에 먼저 익숙해져 있기 때문에 오브젝트 그래픽스가 시작부터 꽤 번거로운 절차들이 등장하고, 뭐 하나 그리려고 해도 몇 줄 써야 하고… 복잡하게 보이게 됩니다.

저에게도 이러한 장벽은 여전히 존재하고, 심지어는 오브젝트 그래픽스로 수많은 프로젝트를 수행하고 책도 저술한 에스이랩 이상우 박사님도 이삼십분 도움말 뒤적이고 나서야 코딩이 시작됩니다. 매일 쓰지 않으니까 자꾸 까먹는 거지요. 어지간 한 것은 Direct Graphics로 훨씬 빨리 해결되고, 어지간한 일은 iTools로 처리할 수 있어서 표준적인 오브젝트 그래픽스 API를 사용하는 일은 IDL 전문가라는 사람들에게도 드문 일에 해당합니다. 하지만 저는 “오브젝트 그래픽스는 왜 이딴 식으로 만든 거야?”라고 생각하지는 않습니다(처음 배울 때는 그렇게 생각했지요). 번거로와 보이는 절차는 모두 디테일한 설정까지 할 수 있도록 사용자에게 열려 있는 기능이라는 것을 알기 때문입니다. 확실히 복잡한 그래픽스를 구현하기에는 오브젝트 그래픽스 표준API가 좋은 선택입니다.

그건 그거고… 저는 이 글에서 오브젝트 그래픽스 만만세를 얘기하고자 하는 것은 아닙니다. 우리가 오브젝트 그래픽스 사용법을 자꾸 까먹는 이유는 80% 이상의 상황을 해결할 수 있고, 더 손쉬운 대안이 존재하기 때문입니다. 80%라는 숫자는 그냥 제 감인데, New Graphics가 나오면서, 그리고 New Graphics에 Volume() 함수가 장착되면서 부터 그쯤의 느낌을 받고 있습니다.

김일석 선수의 한장강의에서 다루었던 내용은 다음과 같이 New Graphics에서 훨씬 간결하게 처리할 수 있습니다.

  • 샘플 데이터 생성은 한장강의와 똑같습니다. 물론 CT 촬영 자료와 같은 실제 3차원 배열 자료를 읽어들여 사용해도 방법은 똑같습니다.

  •  New Graphics의 볼륨 가시화는 보통 한줄로 처리합니다.

 

myvol1=volume(data)

myvol1=volume(data)

이 부분은 골격만 보자면, myvol1=volume(data) 가 되고, 실제로 이렇게만 실행을 해도 준수한 결과를 얻을 수 있습니다. New Graphics는 기본적으로 창의 크기에 따라 축의 스케일을 유동적으로 잡기 때문에, 64*64*64인 정육면체 형태의 데이터가 왜곡되어 보일 수 있습니다. 이를 피하기 위해 X,Y 스케일 일치를 의미하는 ASPECT_RATIO=1.0, Z축 스케일 일치를 의미하는 ASPECT_Z=1.0 을 설정하였습니다. 한장강의와 다른 점은, New Graphics의 Voxel에 대한 투명도 처리 디폴트 설정이, Voxel 농도와 비례하게 되어 있다는 점입니다. 투명도 설정과 관련하여서는 조금 아래서 다시 설명합니다.

 

  • 컬러테이블을 반영하는 것도 매우 간단합니다.

myvol2=volume(data, RGB_TABLE0=39)

myvol2=volume(data, RGB_TABLE0=39)

한장 강의의 예제에서 처럼 39번 컬러테이블을 사용하기 위해, RGB_TABLE0=39 키워드를 사용했습니다. RGB_TABLE0 키워드는 컬러테이블 번호를 받을 수도 있고 3*256 또는 256*3 크기의 R,G,B 색상 조합 컬러테이블 배열을 받을 수도 있습니다.

  • 투명도(OPACITY의 의미는 불투명도이므로 값이 클수록 불투명해 집니다)를 직접 설정하는 것도 간단합니다.

myvol3=volume(data, RGB_TABLE0=39, OPACITY_TABLE0=opa)

myvol3=volume(data, RGB_TABLE0=39, OPACITY_TABLE0=opa)

OPACITY_TABLE0 키워드를 이용해서 복셀값에 대한 불투명도 테이블을 넘겨줍니다. 이 부분을 잘 활용하면, 원하는 복셀 농도만 부각시키는 등의 설정을 할 수 있는 겁니다.

  • POLYGON 함수를 이용해서 등위면을 만드는 것도 가능합니다.

POLYGON 함수가 3*n 배열 형태의 꼭지점 정보를 인식하지 못하네요. 0, 1, 2 컬럼을 각각 X, Y, Z 좌표로 분리하여 뽑아내 사용합니다.

이와같이, IDL의 New Graphics가 대부분의 상황에서 “오브젝트 그래픽스의 그래픽 퀄리티 + 다이렉트 그래픽스의 간결함”을 모두 제공하고 있습니다. 그렇지만, 이렇게 간결해 보이는 데는 다 이유가 있는 것이니, 대부분의 상황, 대부분의 사용자가 이런 식으로 표출하더라 하는 정보를 기반으로 여러 절차를 “디폴트 설정”으로 간소화 하고, 대부분의 상황에서 안쓰이는 기능을 빼버렸기 때문입니다. 제약이 있는 거죠. 일반적인 상황에서, 잘 티는 안나지만… 그래서, 특이한 표출을 계획하거나, 빠른 속도 위주의 가시화 프로그램을 만들 계획이라면 오브젝트 그래픽스의 기본 API를 이용하는 것이 좋습니다. New Graphics 체계나 iTools 체계는 모두 오브젝트 그래픽스 API를 가지고 만든 것입니다.

가까운 미래에, 95%의 상황을 New Graphics가 해결하는 버전이 나온다고 해도(100% 커버는 안될 겁니다. 불편함을 감수해야만 하는 상황은 분명히 존재하고, 앞으로도 남아 있을 거라고 생각합니다. 한장강의에 소개한 볼륨 안쪽에 단면도를 넣는 일이 지금 단계의 New Graphics로는 안됩니다), 그 5%를 위해, 또는 New Graphics를 더 잘 이해하기 위해 오브젝트 그래픽스가 무엇인지는 찬찬히 한번 살펴볼 필요는 있을 겁니다. 하지만… 일단 편한 방법이 있다면 그걸 쓸 수 있는 것도 능력이지요.

New Graphics의 VOLUME() 함수에 대해 관심이 있으시다면, 이상우 박사의 블로그를 방문해 보세요. VOLUME 함수의 활용 1, 2가 게제되어 있습니다.