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
148 메리 크리스마스요~~~ 사랑이 맘 2002.12.24
147 하늘소망 (2) 이춘식 2002.12.11
146 STA 지구 주소록 (1) 박영준 2002.12.08
145 형제사랑 (5) 이춘식 2002.11.30
144 Betther Than I (1) 이춘식 2002.11.25
143 하나님의 평가 이춘식 2002.11.20
142 안녕하셔요…? (1) 사랑이 맘 2002.11.12
141 사랑하는 춘식형님의 결혼에 즈음하여… 이형우 2002.10.14
140 형님 결혼 축하드려요~ (5) 이춘익 2002.10.14
139 감동적인 곡을 듣고 (2) 이춘식 2002.09.30
138 게시판 글이 드문 이유를 생각하다가… (1) 이춘식 2002.09.26
137 기뻐하며 찬양하며 이춘식 2002.08.12
136 더불어 산다는 것 (1) 이춘식 2002.08.05
135 iTRS (2) 이춘식 2002.07.30
134 감동적인 가사 이춘식 2002.06.29
133 값비싼 향유를 이춘식 2002.06.24
132 메일주소 문제 이춘식 2002.06.19
131 근황 (2) 이춘식 2002.06.17
130 여기는 미국 (1) 이춘식 2002.06.16
129 월드컵과 논문 이춘식 2002.06.10
128 길이 멀다고 느껴질때… 이춘식 2002.06.04
127 기도의 능력 (1) 이춘식 2002.05.25
126 근황 ^^ 이춘식 2002.05.23
125 수양회준비중 이춘식 2002.05.16
124 Understanding others (1) 이춘식 2002.05.13