- 확장 영역에서 픽셀을 포함하는 것에 대한 간단한 기준은 지정된 간격 내부에 밝기 값을 평가하는 것이다
- 이 부분에 대한 소스 코드는 다음 파일에서 찾을 수 있다
- Examples/Segmentation/ConnectedThresholdImageFilter.cxx
- 다음에 나오는 예제는 itk::ConnectedThresholdImageFilter 의 사용을 설명한다
- 이 필터는 홍수 채우기 반복자 (flood fill iterator)를 사용한다
- 영역 확장 방법의 알고리즘 복잡도의 대부분은 이웃 픽셀을 방문하는 것으로부터 발생한다
- 홍수 채우기 반복자는 이 책임성을 가정하고 영역 확장 알고리즘의 구현을 매우 간단하게 한다
- 따라서 알고리즘은 특별한 픽셀이 현재의 영역에 포함되는지 아닌지 결졍하는 기준을 세운다
- ConnectedThresholdImageFilter에 의해 사용되는 기준은 사용자에 의해 제공되는 밝기 값의 간격에 기초한다
- 낮은 경계치와 높은 경계치는 제공되어야 한다
- 영역 확장 알고리즘은 이 픽셀의 밝기 값이 간격 내부에 있다는 것을 포함한다
I(X) <= [ lower, upper ]
- 이 알고리즘을 사용하기 위한 최소한의 코드를 보자
- 첫째로, ConnectedThresholdImageFilter 클래스를 포함하는 헤더가 포함되어야 한다
#include "iktConnectedThresholdImageFilter.h"
- 이미지에서 노이즈 표현은 큰 영역을 확장하기 위한 이 필터의 능력치를 감소시키리 수 있다
- 노이즈 이미지에 직면했을 때, 모서리-보존 스무딩 필터를 사용하여 이미지를 전처리하는 것은 보통 편리하다
- 이 특별한 예제에서 우리는 itk::CurvatureFlowImageFilter를 사용한다. 따라서 우리는 그것의 헤더파일을 포함할 필요가 있다
#include "itkCurvatureFlowImageFilter.h"
- 우리는 특별한 픽셀 타입과 차원에 기초하여 이미지 타입을 선언한다
- 이 경우에 스무딩 필터의 요구때문에 픽셀에 float 타입이 사용된다
typedef float InternalPixelType;
const unsigned int Dimension = 2;
typedef itk::Image<InternalPixelType, Dimension> InternalImageType;
- 스무딩 필터는 템플릿 파라미터로 이미지 타입을 사용하여 객체를 선언한다
typedef itk::CurvatureFlowImageFilter< InternalImageType, InternalImageType > CurvatureFlowImageFilterType;
- 그리고 나서 그 필터는 New() 메서드를 호출하여 생성하고 그 결과를 itk::SmartPointer 에 할당한다
CurvatureFlowImageFilterType::Pointer smothing = CurvatureFlowImageFilterType::New();
- 우리는 지금 영역 확장 필터의 타입을 선언한다
- 이 경우에 그것은 ConnectedThresholdImageFilter 이다
typedef itk::ConnectedThresholdImageFilter< InternalImageType, InternalImageType > ConnectedFilterType;
- 그리고 나서, 우리는 New() 메서드를 사용하여 이 클래스의 한가지 필터를 생성한다
ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New();
- 지금 간단한, 일차적인 파이프 라인을 연결할 차례이다
- 파일 리더는 파이프 라인의 초기에 추가되고, 변환 필터와 라이터는 끝에 추가된다
- 변환 필터는 오직 몇 개의 이미지 파일 포맷이 float 타입을 지원하기 때문에 정수 타입을 float 픽셀 타입으로 변환하는 것이 필요하다
smoothing->SetInput( reader->GetOutput() );
connectedThreshold->SetInput( smoothing->GetOutput() );
caster->SetInput( connectedThreshold->GetOutput() );
writer->SetInput( caster->GetOutput() );
- CurvatureFloatImageFilter는 정의되기 위해 2 개의 파라미터를 필요로 한다
- 다음은 2D 이미지를 위한 전형적인 값들이다
- 그러나 그것들은 입력 이미지 안에서 노이즈 표현의 양에 따라 조정되어야 할 수도 있다
smoothing->SetNumberOfIteration( 5 );
smoothing->SetTimeStep( 0.125 );
- ConnectedThresholdImageFilter는 2 개의 정의된 주요 파라미터를 갖는다
- 그것들은 간격의 낮은 경계치와 높은 경계치인데, 여기에서 영역에 포함되기 밝기 값은 위해 떨어져야 한다
- 이 두 값을 매우 가깝게 설정하는 것은 영역을 확장하는데에 충분한 유연성을 허락하지 않을 것이다
- 그것들을 매우 멀리 분리시켜 설정하는 것은 이미지를 에워싸는 영역을 결과로 낼 것이다
connectedThreshold->SetLower( lowerThreshold );
connectedThreshold->SetUpper( upperThreshold );
- 이 필터의 결과물은 추출된 영역을 제외하고 모든 곳의 픽셀 값이 0인 바이너리 이미지이다
- 영역 내의 밝기 값 설정은 메서드 SetReplaceValue() 를 가지고 선택된다
connectedThreshold->SetReplaceValue( 255 );
- 알고리즘의 초기화는 시작점 (seed point)를 사용자에게 제공하는 것을 필요로 한다
- 분할되는 해부 구조의 전형적인 영역에서 놓여지는 이 점을 선택하는 것은 편리하다
- 시작 (seed) 은 itk::Index의 형태로 SetSeed() 메서드에 전달된다
connectedThreshold->SetSeed( index );
- 라이터에서 Update() 메서드의 호출은 파이프 라인의 실행을 일으킨다
- 그것은 에러가 발생하고 예외가 던져지는 경우에 try / catch 블럭에서 호출하게 하는 것이 현명하다
try
{
writer->Update();
}
catch( itk::ExceptionObject& excep )
{
std::cerr << "Exception caught !" << std::endl;
std::cerr << excep << std::endl;
}
- 디렉토리 Examples/Data 에서 제공하는 BrainProtonDensitySlice.png 이미지를 입력값으로 사용하여 이 예제를 실행해보자
- 우리는 쉽게 적당한 위치에서 시작점을 제공하고 낮은 경계치와 높은 경계치에 대한 값을 정의함으로써 주요 해부학적인 구조를 쉽게 분할할 수 있다
- 그림 9.1은 분할의 여러 가지 예를 보여준다
- 사용된 파라미터는 표 9.1에 나와있다
- gray matter는 완전히 분할되지 않는 것에 주목하라
- 이것은 분할되는 해부 구조가 이미지 공간에서 동차적인 통계 분포 (homogeneous statistical distribution)를 갖지 않을 때 영역 확장 방법의 취약성을 보여준다
- 어떻게 수락된 영역이 확장되는지 입증하기 위해 낮은 경계치와 높은 경계치를 다른 값으로 실험하기를 원할 수도 있다
- 영역을 분할하는 데 대한 또다른 옵션은 여러 시작을 다루기 위해 ConnectedThresholdImageFilter에 의해 제공되는 기능을 취한다
- 이 시작은 AddSeed() 메서드를 사용하여 필터에 하나씩 전달할 수 있다
- 사용자 인터페이스를 상상하라. 여기에서 연산자는 분할된 객체의 여러 점을 클릭하고 각 선택된 점은 이 필터에 시작으로 전달된다
댓글