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
248 배훈형 딸 찬미와 송미 (4) 이춘식 2006.04.09
247 봄에 쓰는 근황 (5) 이춘식 2006.03.23
246 성경 1독을 마치며 (13) 이춘식 2006.01.17
245 2006년 1월 경건의 시간 이춘식 2006.01.10
244 근황 ^^ (4) 이춘식 2005.12.06
243 주님을 기다리며 (2) 이춘식 2005.11.23
242 일뱅 손앵우입니다. (1) 앵우 2005.10.29
241 연구실에서… 근황 (2) 이춘식 2005.10.26
240 논문쓰기 이춘식 2005.10.19
239 오랜만에 늦게까지 (6) 이춘식 2005.10.09
238 10월 경건의 시간 말씀 이춘식 2005.10.03
237 2005년 9월 경건의 시간 말씀 (4) 이춘식 2005.09.25
236 부대찌개를 만들다 이춘식 2005.09.22
235 홈페이지 (1) 하원아빠 2005.09.05
234 단결 ! 이병 손영우입니다. (1) 앵우 2005.08.27
233 쿠키보따리 (2) 이춘식 2005.08.23
232 예쁜 딸 하원이 (2) 이춘식 2005.08.14
231 부자되는 법 (4) 이춘식 2005.08.07
230 산딸기이야기 (4) 이춘식 2005.07.07
229 Stylized model 장기부피 계산법 (2) 이춘식 2005.06.14
228 비오는 날 근황 (4) 이춘식 2005.06.12
227 hx2415 (2) 이춘식 2005.04.29
226 학회를 다녀와서 (2) 이춘식 2005.04.22
225 중국선교의 아버지 Hudson Taylor 이춘식 2005.04.15
224 약속에 의지하여(2) (2) 이춘식 2005.04.04