728x90
Dicom 데이터를 이용한 vtkImageData를 생성하고 Dicom의 MetaData를 적용하여 ImageData의 origin과 Slice position을 제어하고자 한다.
기본 이미지는 Dicom의 Slice 에 따라서 +Z Direction 으로 이미지를 쌓는다.
또한 vtkImageData 의 좌표계는 이미지의 좌측 하단을 원점으로 하므로 Dicom의 좌표계는 다르다.
vtkImageData 좌표계 |
Dicom 좌표계 LPS |
vtkImageData -> Dicom 이미지 좌표를 변환하기 위해서는 Flip을 수행한다.
var dicomSeriesList = DicomDataUtils.LoadDicomSeries(DirPath);
var validSer = dicomSeriesList.First(SimDataUtils.CheckValidDicomSeries);
//이미지 데이터 생성
var simData = SimDataUtils.CreateSimImageData(validSer);
var imgData = simData.ImageData;
var imgMap = vtkImageMapToWindowLevelColors.New();
imgMap.SetLevel(280);
imgMap.SetWindow(1600);
imgMap.SetInputData(imgData);
imgMap.Update();
var flipImg = vtkImageFlip.New();
flipImg.SetFilteredAxis(1);
flipImg.SetInputConnection(imgMap.GetOutputPort());
flipImg.Update();
var mapper = vtkFixedPointVolumeRayCastMapper.New();
mapper.SetInputConnection(flipImg.GetOutputPort());
var volume = vtkVolume.New();
volume.SetMapper(mapper);
var renWin = vtkRenderWindow.New();
var interactor = vtkRenderWindowInteractor.New();
var renderer = vtkRenderer.New();
interactor.SetRenderWindow(renWin);
renWin.AddRenderer(renderer);
var axesActor = VtkCoordUtils.MakeAxesActor(new double[] { 200, 200, 200 }, new string[] { "X", "Y", "Z" });
axesActor.SetOrigin(imgData.GetOrigin().ToIntPtr());
renderer.AddActor(axesActor);
renderer.AddVolume(volume);
renWin.Render();
interactor.Start();
728x90
728x90