Friday, June 10, 2011

Porosity View DVR with pre-processed sub-volume

DVR에서 sample position 의 voxel value를 다양한 metric으로 해석하여 optical property를 정의할 수 있다는 것은 Multi Metric for Optical Property 에서 이미 언급하였다.

이것의 연장선 상에서 DVR 이전에, 전처리를 통해 얻은 새로운 metric으로 지정된 sub-volume을 main-volume의 geometry 와 같게 설정하면 위의 방법을 통한 DVR 이 가능하다.

추가적으로, 여기에서는 sub-volume 을 '속성'이 아닌 태그의 개념으로 정의할 수 있고, 태그 ID를 통해 여러 1D OTF를 할당하여 태그 영역의 속성을 이해하는데 도움을 주는 DVR을 실현 수 있다. 그러나 이것은 main volume의 metric에 의존하지 않는다는 점에서 main volume에 "속성 의존적"인 결과를 도출하기가 어렵다.
하여, 이 방법은 주로 segmentation 된 결과 자체를 main volume의 기하학적 구조와 연계하여 분석하는 것에만 도움을 줄 수 있다.
(이 경우, OTF를 공유하지 않는 main and sub volume의 관계는 position 에 의해서만 결정된다는 점을 생각.)

따라서 이보다 더 심층적인 main volume과 sub volume의 연계성을 확인하기 위해서는, 각 volume의 value가 sample 지점의 optical property를 결정하는데 영향을 주도록 modulation을 사용하거나 두 volume의 metric으로부터 정의되는 2D OTF를 사용하면 된다.

여기서는 두 volume의 관계를 선형적 분석이 아닌 비선형적 분석이 가능한 2D OTF 방법을 사용하도록 한다. (추가적으로 , 2D OTF는 2D histogram을 통한 value의 분포를 확인할 수도 있다는 점에서 매력적이다.)

다음은 여기서 실험할 기공(porosity)를 많이 포함하고 있는 industrial data의 DVR이다.

이것을 voxel 단위로 size를 추출(volume 의 surface 내부로 판정되는 곳에서 비슷한 value를 갖는 연결된 크기를 각 voxel 단위로 계산)하는 전처리 과정으로 새로운 volume 을 생성한다.
실험 data의 전체 실루엣만 나타나게 하는 반투명 가시화 widget에, 특정 main volume의 value 영역에서 임의의 size 영역대에 color widget을 설정하여 DVR을 진행한다.


다음은 하나의 volume으로 빠르게 구할 수 있는 density&Gradient Magnitude를 이용한 예이다.


비교적 비싼 전처리를 통해 얻은 sub volume 기반보다 porosity를 확인하기 어렵다.

따라서, 정리하자면... 다음은 위에서 언급한 두 개의 볼륨 속성을 보는 방법을 고려해 볼 때
  • Main volume => On the fly computation => 2D OTF
  • Main volume => Sub volume 생성 => 2D OTF
  • Main Volume에 대한 1D OTF와 Subvolume 에 대한 modulation
  • Main Volume에 대한 1D OTF와 Subvolume 에 대한 sub 1D OTF
두 번째가 가장 효율적 DVR 방법이라는 결론을 내릴 수 있다.
    만약... 이 외의 방법이 존재 한다면?! -_-?

    thanks for jun and victory

    TObject for OTF archive and TF setting module

    그동안 여러 시행착오를 반복하면서, VXFramework의 자료구조와 이를 기반으로 하는 각종 Interface가 안정화 되었지만 유독 찝찝함을 내제하고 있는 인터페이스가 바로 OTF  정의에 대한 것이었다.

    사실 OTF를 정의하는 자료구조 자체는 큰 문제가 없었지만, 이를 설정하는 범위를 Native Frame에서 어느 범위까지로 하는가는 Managed Frame에서의 overhead와 직결되는 문제로 이해 했었다.

    그러나 이는 "OTF 설정"의 범위를 광범위하게 정의하고, 작은 부분까지 Native 모듈에서 처리하게 하려는 욕심에서 비롯된 생각이었다. 그러나 OTF 설정을 다음과 같이 네 가지로 나누고

    1. Control Point를 통한 Optical Color Array 지정
    2. 지정된 Optical Color Array의 TObject Archive 할당
    3. Optical Color Array의 Refinement (for adv. DVR)
    4. 볼륨 분석을 통한 자동 Optical Color Array 지정

    Managed 와 Native 모듈에서 맡아야 할 설정 범위를 생각해 보면, 이 모두를 Native 모듈에서 다 다뤄야 할 필요가 없음을 알 수 있다.
    특히 Control Point 지정은 사용자 컨트롤과 자동 설정의 두 가지 방법을 통해 가능하며, 전자를 통한 지정 시 사용자 interaction 작업이 용이한 Managed Frame에서 작업하는 것이 더 효율적이라는 판단을 내릴 수 있다.

    나머지 2,3,4번은 모두 Native TF Module에서 작업하되, 2번은 기능의 확장성을 고려하여 3번과 연계해 Default Manipulator 모듈에서 작업한다. 4번은 그 overhead를 고려하여 기존의 TObject를 정의하는 Archive 자료 구조 외에 CustomList object를 TF 모듈의 in/output 으로 이용한다.

    위에서 설명한 부분 외에 Managed Frame 에서 TObject 조작을 위한 Component 설정을 편리하게 하기 위해, 내부에서 OTF 설정을 위한 VXFunctionScenario를 추가한다.

    이를 통해 다음의 Managed Component 설정 코드가

    이렇게 한 줄로 줄어든다. (설마 두 줄이라고 우기는 사람은 없겠지..)

    -_-v 그러나 문제는........... 자료구조의 정리 및 Interface 변화로 OTF 모듈과 Managed Component 코드를 수정해야 하는 대작업을 해야 한다는 것! ㅠㅠ

    이를 통해 다시 한 번 느끼는 것이지만 부적절한 자료 구조 및 interface 설계는 대재앙을 몰고 온다는 것..

    Wednesday, June 08, 2011

    Clipping Boundary Unshading Mode

    불투명에 가까운 Surface Rendering 에서 볼륨의 내부 구조를 보기 위한 대표적인 방법으로 Clipping 이 있다. 그러나 볼륨 내부가 Iso-value 영역 (또는 homogeneous Region) 일 경우 Gradient normal vector가 불균형하게 정의되어 Shading 이 제대로 안 되는 문제가 발생한다.

    반투명 DVR 에서 Clipped 표면의 투명도가 높을 경우 해당 표면의 Shading 이 최종 Rendering 결과에 미치는 영향이 미비하여 이를 무시할 수 있다. 그러나 Clipped 표면이 반투명에 가깝게 가시화될 경우, 다음과 같이 경계가 지저분하게 가시화된다.


    <타이어 휠 데이터에 대한 Clipping 가시화>

    이 경우 Clipped 단면을 '깨끗히' 가시화하기 위해 단면의 Voxel 이 정의하는 normal vector를 Clipping plane의 normal vector 로 사용하여 가시화하거나, normal vector에 영향을 받는 shading factor를 적용 안 한 Unshading mode를 사용하는 방법있다.

    전자의 경우 Clipping Box가 회전함에 따라 Shading 이 Clipped 표면에서 일괄적으로 바뀌는 가시화가 이루어지는데, Clipped 표면 자체에 집중할 경우 보기가 불편할 수 있다는 단점이 있다.

    하여, 여기서는 후자인 Unshading mode를 사용하였다.

    <Unshading Mode를 적용한 가시화 결과>

    그러나 문제는 큰 사이즈의 볼륨을 가시화하기 위해 Chunk 자료 구조를 사용할 경우, 다음과 같이 예기치 못한 문제에 봉착할 수 있다는 것이다.
    물론 학술적으로 전혀 의미가 없지만 프로그램의 완성도를 위해 이를 처리할 필요가 있었다.


    Chunk 단위의 가시화를 위해 Sample Box를 Chunk와 Clipping Box의 교집합으로 정의할 경우, 이러한 Chunk 경계에서 예기치 않은 unshading 으로 인한 줄무늬가 발생한다.
    이를 해결하기 위해 Chunk 경계가 Clipping Box 안에 있는가를 확인하는 루팅을 두었고, 이는 최초 Sample Box의 시작점에 대해서만 판정해 주면 되기 때문에 별도의 overhead도 거의 없는 효과적인 방법이다.

    다음은 이 문제를 해결한 최종 결과이다.

    -_-v

    Friday, June 03, 2011

    Multi Metric for Optical Property

    XYZ 의 위치에 Scalar value 로 정의되는 4차원 데이터를 샘플하고 이를 광학 이론에 적용하여 가시화 하는 것을 Direct Volume Rendering (DVR)이라고 한다.

    짧은 문구지만 여기에는 물리적으로 검증된 광학 모델, 대용량 데이터의 Sampling Theorem, 다차원 데이터를 효과적으로 보이기 위한 Information Visualization (외의 HCI 기술), 삼차원 가시화 조작과 관련된 CAD 기술 등... 많은 내용을 함축하고 있다.

    전통적으로 삼차원 공간에 정의된 Scalar filed 에서 "의미 있는" 영역을 보기 위해 Scalar value 를 RGBA 의 광학적 속성으로 바꿔 주는 1D Optical Transfer Function (OTF) 을 사용해 왔다.

    [옆의 그림에서 하단에 있는 것이 Gaussian Kernel 기반의 1D Color OTF 이다.]

    그러나 DVR은 볼륨데이터에 직접적으로 정의되어 있는 Scalar value 와 같은 Metric 외에 간접적으로 정의된 Metric (예. Scalar Field 가 정의하는 Gradient Magnitude Field) 을 이용하여 정의된 볼륨의광학적 속성을 가시화로 연결할 수 있다.

    그리고 이것은 불투명한 표면의 삼차원 가시화가 갖는 근본적 한계인 "가려진 중요 부분"의 직관적 파악을 위한 효과적 가시화의 핵심 기술로 활용될 수 있다.

    이 경우 추가적인 볼륨 정보 (위에서 언급한 간접적으로 정의된 Metric )는 1. Modulation, 2. Multi Dimension OTF 를 통해 볼륨의 광학적 속성 정의에 사용되며, 이것은 DVR 을 통해 전체적인 Context 및 내부의 숨겨진 Context를 삼차원으로 가시화 하는 데에 사용된다.


    위의 그림은 Gradient Magnitude, Shading을 위해 쉽게 구할 수 있는 몇몇 factor를 기반으로 1D OTF 결과(왼쪽)의 Alpha 에 modulation을 적용한 결과(오른쪽)이다.


    위의 그림은 2D OTF 를 기반으로 가시화한 결과이며,  Volume 의 Scalar value 와 이것이 정의하는 Gradient Magnitude 를, 3개의 Colored Widget 을 통해 볼륨에 광학적 속성을 부여한 결과이다.

    이외에도 내/외부 구조를 한번에 직관적으로 볼 수 있는 몇몇 방법이 있지만 사용자 컨트롤에 대한 한계, 가시화 속도에 대한 한계 등으로 잘 사용하지 않고 위의 두 방법을 가장 많이 이용한다.

    Thx for Victory

    Thursday, June 02, 2011

    Scene Background Setting & Blending

    그동안 Native Engine 의 Rendering 결과를 Managed Frame 에서 보여 주기 위해 File Memory 를 매개로 Interoperation 을 해 왔다.
    이를 위해 Common Control에서 "InteropBitmap"을 이용해 왔는데, 이것이 .net framework 과 연계되어 Control 에 Image Source 형식으로 붙을 수 있다는 점에서 WPF designer 이나 Brush Control 로 쉽게 코딩할 수 있는 Background 와 Blending 할 수 있겠다는 생각을 늘 해 왔다.
    실제로 Native Engine 의 Rendering 결과가 RGBA 채널을 갖고 있고, A 채널 역시 계산되므로 .net framework의 기본 blending 을 활용할 수 있는 가능성이 높았다.

    하여 그동안 다음과 같이 WPF designer 에서 Panel 의 Background 를 정의했었으나 Rendering 결과가 Blending 되지 않고 Background 부분이 Native의 RGB 색으로 (여기서는 검정) 다음과 같이 나왔다.


    그러나 "InteropBitmap" 을 생성하는 코드를
    bitmapSource = (InteropBitmap)Imaging.CreateBitmapSourceFromMemorySection(ipFileMapSection, iWidth, iHeight, PixelFormats.Bgr32, iRawStride, 0);
    다음과 같이 수정함으로써
    bitmapSource = (InteropBitmap)Imaging.CreateBitmapSourceFromMemorySection(ipFileMapSection, iWidth, iHeight, PixelFormats.Bgra32, iRawStride, 0);

    다음과 같이 세팅된 Panel에 대하여


    제대로 Blending 하는 결과를 얻을 수 있었다.

    이것이 의미하는 것은 Rendering 결과를 나타내는 component 에 .net  framework 을 통해 쉽게 Background 를 지정하고 이것에 Blending 함으로써 전체적으로 완성도 높은 이미지를 도출할 수 있다는 것이다.

    Thanks for Victory...