Reading, Casting and Writing Images
- 이 부분에 대한 소스 코드는 다음 파일에서 찾을 수 있다
- Examples/IO/ImageReadCastWrite.cxx
- ITK가 일반적인 프로그래밍 패러다임에 기초한다고 주어졌을 때, 타입의 대부분은 컴파일 시간에 정의된다
- 이미지의 다른 타입 사이에 변환을 기대하는 것은 때때로 중요하다
- 다음 예제는 하나의 픽셀 타입의 이미지를 읽고 그것을 다른 픽셀 타입으로 쓰는 공통적인 경우를 설명한다
- 이 과정은 입력과 출력 픽셀 타입의 다양한 범위는 매우 다를 수 있기 때문에 변환뿐만 아니라 이미지 밝기를 조정을 포함한다
- itk::RescaleIntensityImageFilter 는 여기에 이미지 값을 선형으로 재조정하기 위해 여기에 사용된다
- 이 예제에서 첫 번째 단계는 적절한 헤더를 포함하는 것이다
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"
- 그리고 나서 평소와 같이 결정은 이미지를 나타내는 데 사용되어야 하는 픽셀 타입에 대해 만들어져야 한다
- 이미지를 읽을 때, 이 픽셀 타입은 파일에 저장된 이미지의 픽셀 타입에 필수적이지 않다는 것을 주목하라
- 대신에, 그것은 메모리에 읽히자마자 이미지를 저장하는데 사용될 타입이다
typedef float InputPixelType;
typedef unsigned char OutputPixelType;
const unsigned int Dimension = 2;
typedef itk::Image< InputPixelType, Dimension > InputImageType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
- 메모리에서 이미지의 차원은파일에서 이미지 중 하나에 일치해야 한다는 것을 주목하라
- 이 조건이 풀어지는 두 가지 특별한 경우가 있지만, 일반적으로 두 개의 차원을 일치하는 것을 보증하는 것이 더 낫다
- reader와 writer의 타입을 인스턴스화 할 수 있다
- 이 두 개의 클래스는 이미지 타입에 대해 파라미터화 한다
typedef itk::ImageFileReader< InputImageType > ReaderType;
typedef itk::ImageFileWriter< InputImageType > WriterType;
- 아래에 이미지 밝기를 선형적으로 조정하는 RescaleIntensityImageFilter 클래스를 인스턴스화 한다
typedef itk::RescaleIntensityImageFilter< InputImageType, OutputImagetype> FilterType;
- 필터 객체는 생성되고 SetOutputMinimum() 과 SetOutputMaximum() 메서드를 사용하여 출력의 최소값과 최대값이 선택된다
FilterType::Pointer filter = FilterType::New();
filter->SetOutputMinimum( 0);
filter->SetOutputMaximum(255);
그리고 나서, reader와 writer를 생성하고 파이프라인에 연결한다
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
filter->SetInput( reader->GetOutput() );
writer->SetInput( filter->GetOutput() );
- 읽고 써야 할 파일의 이름은 SetFileName() 메서드로 넘겨준다
reader->SetFileName( inputFileName );
writer->SetFileName( outputFileName );
- 마지막으로 writer에 Update() 메서드를 가지고 파이프라인의 실행한다
- 출력 이미지는 스케일 되고 입력 이미지의 변환 버전이다
try
{
writer->Update();
}
catch( itk::ExceptionObject& err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}