- 이 부분에 대한 소스 코드는 다음 파일에서 찾을 수 있다
- Examples/IO/ImageReadExportVTK.cxx
- 사용자가 무슨 파일 포맷을 사용하는지 알고 이것을 명시적으로 지시하기를 원하는 경우에, 구체적은 itk::ImageIO 클래스는 인스턴스화될 수 있고 이미지 파일 reader 또는 writer에 할당될 수 있다
- 이것은 IO 연산을 수행하기 위한 적절한 ImageIO 클래스를 찾는 것을 시도하는 itk::ImageIOFactory 메커니즘을 피한다
- ImageIO의 명시적인 선택은 또한 사용자가 ImageIO에 의해 제공되는 일반적인 API로부터 사용할 수 없을 수도 있는 특별한 클래스의 특수화된 특징을 호출할 수 있게 허럭한다
- 다음의 예는 IO 클래스의 명시적인 인스턴스화의 예이고 ( 이 경우에 VTK 파일 포맷), 그것의 파라미터를 설정 후 그것을 itk::ImageFileWriter에 연결한다
- 이 예는 적절한 헤더를 추가하여 시작한다
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkVTKFImageIO.h"
- 그리고 나서, 보통처럼 픽셀 타입과 이미지 차원을 선택한다
- 만약 파일 포맷이 특별한 타입을 가진 픽셀을 나타낸다면, C 스타일 변환은 데이터를 변환하기 위해 수행될 것이라는 것을 기억하라
typedef unsigned short PixelType;
const unsigned int Dimension = 2;
typedef itk::Image< PixelType, Dimension > ImageType;
- reader와 writer를 인스턴스화 할 수 있다
- 이 두 개의 클래스는 이미지 타입에 의해 파라미터화 된다
- 또한 itk::VTKImageIO 클래스를 인스턴스화 한다
- ImageIO 객체는 템플릿화 되지 않는다는 것을 주목하라
typedef itk::ImageFileReader< ImageType > ReaderType;
typedef itk::ImageFileWriter< ImageType > WriterType;
typedef itk::VTKImageIO ImageIOType;
- 그리고 나서, New() 메서드를 사용하여 각 태입의 객체를 생성하고 itk::SmartPointer에 결과를 할당한다
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
ImageIOType::Pointer vtkIO = ImageIOType::New();
- 읽거나 또는 쓰기 위한 파일의 이름은 SetFileName( ) 메서드를 가지고 전달한다
reader->SetFileName( inputFileName );
writer->SetFileName( outputFileName );
- 파이프 라인에서 이 reader와 writer를 필터에 연결할 수 있다
- 예를 들면, writer의 입력에 직접적으로 reader의 출력을 전달하여 짧은 파이프라인을 생성할 수 잇다
writer->SetInput( reader->GetOutput() );
- 명시적으로 특별한 VTIImageIO를 선언하는 것은 사용자가 특별한 IO 클래스를 지정하는 메서드를 호출하는 것을 허락한다
- 예를 들면, 다음 줄은 픽셀 데이터를 쓸 때 ASCII 포맷을 사용하기 위해 writer에 지정한다
vtkIO->SetFileTypeToASCII();
- VTKImageIO 객체는 그리고 나서 ImageFileWriter에 연결된다
- 이것은 ImageIOFactory 메커니즘의 액션에 합쳐질 것이다
- ImageFileWriter 는 쓰는 작업이 가능한 다른 ImageIO 객체를 찾는 것을 시도하지 않을 것이다
- 그것은 사용자에 의해 제공된 하나를 간단하게 호출할 것이다
writer->SetImageIO( vtkIO );
- 마지막으로 ImageFileWriter에 Update()를 호출하고 이 호출을 쓰기가 진행되는 동안 어떤 에러가 발생하는 경우에 try/catch 블록에 놓을 것이다
try
{
writer->Update();
}
catch( itk::ExceptionObject& err )
{
std::cerr << "ExceptionObject caught ! " << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
- 이 예는 ImageFileWriter에 명시적인 ImageIO 클래스를 사용하는 방법을 오직 설명하는 예제이지만, ImageFileReader에도 같은 방법으로 행할 수 있다
- 이것이 행해지는 전형적인 경우는 itk::RawImageIO 객체를 가지고 raw 이미지 파일을 읽을 때이다
- 이 접근 방법의 결점은 이미지의 파라미터는 명시적으로 코드에 의해 쓰여져야 한다
- raw 파일의 직접적인 사용은 의료 이미지에서 강력하게 낙담시킨다
- itk::MetaImageIO, itk::GiplImageIO 와 itk::VTKImageIO 와 같은, 텍스트 헤더 파일과 raw 바이너리 파일을 합한 파일 포맷 중 어떤 것을 사용하여 raw 파일에 대한 헤더를 생성하는 것이 항상 훨씬 더 낫다
댓글