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
198 ILOG사건(1) 이춘식 2004.06.16
197 나이제 주님의 새생명 얻은몸 이춘식 2004.06.13
196 하원이 근황 (3) 이춘식 2004.06.02
195 춘식이형 저 용탭니다..^^ (2) 서용태 2004.05.22
194 Better than I (2) 이춘식 2004.05.19
193 논문을 쓰면서 (2) 이춘식 2004.05.10
192 하원이의 근황 (6) 이춘식 2004.05.09
191 생후 10일 (6) 이춘식 2004.04.11
190 아기가 태어났습니다. (8) 이춘식 2004.04.02
189 즐거운 성경읽기 이춘식 2004.03.26
188 시를 읽으며 힘을 얻음 (1) 이춘식 2004.03.25
187 고부(姑婦) 이춘식 2004.02.17
186 개인약속 여호수아1:8-9 (1) 이춘식 2004.02.10
185 Medical Physics (1) 이춘식 2004.02.02
184 탁상공론 (3) 이춘식 2004.01.11
183 밧데리 관련정보 이춘식 2004.01.05
182 미국에서온 아버지 편지 이춘식 2003.12.20
181 표준한국인만들기 ^^ (1) 이춘식 2003.12.18
180 미국가신 부모님 이춘식 2003.12.16
179 근황 ^^ 이춘식 2003.12.05
178 영접하는 자 (1) 이춘식 2003.11.26
177 파일복원 이춘식 2003.11.13
176 아기사진 –v (8) 이춘식 2003.10.23
175 근황 (1) 이춘식 2003.10.18
174 추석 수양회 이춘식 2003.09.09