본문 바로가기

Programming/VTK

[VTK] 3d 데이터에서 가장 큰 영역만 추출하기 (MFC, vs2019)

본 글은 이전글에서 이어지는 내용입니다.

이전글을 읽고 오시면 더 자연스럽게 이해하실 수 있습니다.

 

2025.03.21 - [Programming/VTK] - [VTK] dicom 데이터(CT image)에서 뼈 영역만 남기기

 

[VTK] dicom 데이터(CT image)에서 뼈 영역만 남기기

CT 데이터는 3D 픽셀(=Voxel)로 이루어져 있으며, 각 Voxel에는Hounsfield Unit (HU) 값이 있습니다.   Hounsfield Unit 이란? HU는 물질이 X-ray를 얼마나 흡수하느냐(=조직의 밀도)를 숫자로 나타낸 값입니다.주

binarylog.tistory.com

 


 

vtk에서는 vtkPolyDataConnectivityFilter를 이용하여 mesh의 연속성 검사를 할 수 있습니다. 

 

이를 통해 mesh data에서 가장 큰 영역을 추출하거나 특정 위치에서 연결된 영역 추출 또는 연결된 영역별로 모두 추출하는 것이 가능합니다. 

 

이는 노이즈 제거클러스터링(clustering)에 주로 사용됩니다. 

 

그렇다면 vtkFlyingEdges3D를 사용한 3d 볼륨 데이터에서 가장 큰 영역만 불러오기 위해서는 어떻게 하면 될까요 ?

 

vtkSmartPointer<vtkActor> CvtkMFCDlgEXDlg::initImageActor(CString cstrImagePath)
{

	vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
	const char* charPath = (char*)(LPCTSTR)cstrImagePath;
	reader->SetDirectoryName(charPath);
	reader->Update();

	vtkNew<vtkFlyingEdges3D> flyingEdges3D_bone;
	flyingEdges3D_bone->SetInputConnection(reader->GetOutputPort());
	flyingEdges3D_bone->SetValue(0, 250);

	vtkNew<vtkPolyDataConnectivityFilter> conFilter;
	conFilter->SetInputConnection(flyingEdges3D_bone->GetOutputPort());
	//1) 모든 영역 추출
	//conFilter->SetExtractionModeToAllRegions();

	//2) 가장 큰 영역 추출
	conFilter->SetExtractionModeToLargestRegion();
	conFilter->Update();

 

vtkPolyDataConnectivityFilterSetExtractionModeToLargestRegion()를 사용하여 mesh 데이터에서 가장 큰 영역만 추출할 수 있습니다. 

 

결과는 다음과 같습니다. 

 

가장 큰 영역 이외에도, 특정 seed로 연결된 영역을 추출하거나,

특정 point와  가까운 점과 연결된 영역을 추출할 수 도 있습니다.  

 

해당 방법은 다음과 같습니다. 

 

	//3) seed로 연결된 영역 추출
	conFilter->AddSeed(id);
	conFilter->SetExtractionModeToCellSeededRegions();
	conFilter->SetExtractionModeToPointSeededRegions();

	//3) 특정 point와 가까운 점과 연결된 영역 추출
	conFilter->SetClosestPoint(x,y,z);
	conFilter->SetExtractionModeToClosestPointRegion();