Voxelizer

No. 271 Name 이춘식 Date 2006.10.10 09:18 Comments 0

지난번 올린 글에서 고민하던 voxelization algorithm이 해결되었다. 참으로 긴시간이었는데… 어찌보면 하이브리드 모델을 만드는데 있어서 가장 핵심적인 기술이라고 볼 수 있다. 이 부분에서 얼마나 정확하게 계산해내는가에 따라 하이브리드 모델의 장래가 결정된다.

처음 만들었던 voxelization algorithm의 핵심부분은 다음과 같다.
…..
        for t=0:step:1;
            x_pos=x(1)+(x(2)-x(1))*t;
            y_pos=y(1)+(y(2)-y(1))*t;
            voxel(xmin+round(x_pos/res(1)),ymin+round(y_pos/res(2)),zmin+round(z_slice/res(3)))=organtag(object);
        end

    temp=zeros(size(voxel,1),size(voxel,2),size(voxel,3)); % temporary matrix bounding object
    temp(find(voxel==organtag(object)))=1;
    for z=1:size(voxel,3)
    [B,temp(:,:,z)] = bwboundaries(temp(:,:,z),8,’holes’);
    end
    voxel(find(temp~=0))=0;
    voxel(find(imerode(temp,se)~=0))=organtag(object);
…..

이 코드의 문제는 본래 polygon mesh model의 volume을 너무 크게(20% 이상) 묘사한다는 것이다. ICRP89의 값에 3% 이내로 접근하려는 지금, 문제가 있는 코드였다. 이때부터 고민을 시작하여 다른 algorithm을 도입했다. 처음 것보다 속도는 훨씬 빨랐으나 여전히 volume문제가 있었다. 두번째 코드의 핵심부분이다.
…..
        % index voxels on the line segment
        if (x(2)-x(1))/(y(2)-y(1)) >= 0
            x_min=min(x); % slope>0
            x_max=max(x);
            sign=1;
        else
            x_min=max(x); % slope<0
            x_max=min(x);
            sign=-1;
        end
            y_min=min(y);
            y_max=max(y);
            if max(x)-min(x) > max(y)-min(y)
                % 0<slope<1
                for xtemp=x_min:sign*res(1)/2:x_max;
                    if y_max==y_min ytemp=y_min;
                    else
                    ytemp=((y_max-y_min)/(x_max-x_min))*(xtemp-x_min)+y_min;
                    end
                    voxel(xmargin+fix(xtemp/res(1)),ymargin+fix(ytemp/res(2)),zmargin+round(z_slice/res(3)))=organtag(object);
                end
            else
                % slope>1
                for ytemp=y_min:res(2):y_max;
                    if x_max==x_min xtemp=x_min;
                    else
                    xtemp=((x_max-x_min)/(y_max-y_min))*(ytemp-y_min)+x_min;
                    end
                    voxel(xmargin+fix(xtemp/res(1)),ymargin+fix(ytemp/res(2)),zmargin+round(z_slice/res(3)))=organtag(object);
                end
            end
…..

그냥 대충 봐도 뭔가 조잡한 느낌이다. 여전히 문제를 안고 있었고… 그래서 고민을 다시 시작했다. 결국에는 scanline algorithm이라는 것을 발견했고 오랜 코딩과 디버깅을 거쳐 결국에는 Voxelizer라는 코드를 완성했다. 이 코드의 핵심부분은 이곳에도 올려놓을 수 없다. 이전 코드의 문제점은 volume말고도 또 한가지가 있었는데 contour내부에 있는 contour는 묘사하지 못한다는 치명적인 오류였다. Cranium과 vertebrae쪽에서 문제가 많았다. Voxelizer는 이 모든 문제를 해결했다.

이 일은 내가 한 것이 아니라 하나님께서 하셨다는 것이 너무나 분명하다. 내 머리의 한계를 철저하게 경험한 뒤 기도하면서 한 일이라서 그렇다. 잠3:5-6말씀을 몇번이나 연습장에 쓰면서 했는지 모르겠다. 하나님께 모든 영광을 드리고 나중에라도 이 순간을 기억하며 교훈을 삼기위해 이곳에 글을 남긴다.

그림은 갈비뼈다. 갈비뼈 주위로 cartilage가 덥혀있고 coastal cartilage쪽은 완전히 cartilage로만 되어있는 것을 볼 수 있다.
그림은 복잡한 cranium의 단층이다. contour속에 있는 contour도 정확하게 묘사해낸다.
그림은 갈비뼈다. 갈비뼈 주위로 cartilage가 덥혀있고 coastal cartilage쪽은 완전히 cartilage로만 되어있는 것을 볼 수 있다.
그림은 복잡한 cranium의 단층이다. contour속에 있는 contour도 정확하게 묘사해낸다.

essay_choonsik

No Title Name Date
323 NCI 생활 (3) Choonsik 2009.05.21
322 새로운 시작 (2) Choonsik 2009.05.07
321 From UF to NCI (1) Choonsik 2009.04.27
320 도전이 되는 글 Choonsik 2009.03.05
319 2009년 1월 26일 근황 (6) 이춘식 2009.01.27
318 ICRP invitation letter (1) 이춘식 2009.01.27
317 Andy형제님댁 방문 (2) 이춘식 2009.01.05
316 Little drummer boy (1) 이춘식 2008.12.15
315 Promise 이춘식 2008.12.11
314 섬기는 삶 (1) 이춘식 2008.12.05
313 강의속에 동행하심 (4) 이춘식 2008.11.13
312 Consulting 이춘식 2008.09.14
311 근황 (4) 이춘식 2008.08.16
310 SNM 2008에 다녀오다 (1) 이춘식 2008.06.30
309 Summary Bible reading! 이춘식 2008.06.11
308 UF hybrid phantom series 이춘식 2008.06.04
307 기도응답 이춘식 2008.05.29
306 악성답글문제 이춘식 2008.04.23
305 상현형제 방문 이춘식 2008.04.20
304 Open your eyes! 이춘식 2008.03.20
303 JNM paper (6) 이춘식 2008.02.21
302 졸면서 성경읽기 이춘식 2008.02.06
301 볼치교수님댁 방문 (10) 이춘식 2007.12.31
300 2007년을 마무리하며 (4) 이춘식 2007.12.23
299 이사야 읽기 이춘식 2007.12.17