ITK 全名Insight Segmentation and Registration Toolkit 是一款開源的醫學圖像處理軟件包,用於處理醫學圖像中的兩大難題:圖像配準、圖像分割。
***********************************************************************************************
一、醫學圖像主要信息主要包換兩類:
第一類:patient information 病人信息
病人姓名、病人出生日期、拍攝醫院、拍攝時間等。
第二類:image information 圖像信息
1、spacing圖像間距
2、origin圖像原點位置
3、direction圖像方向
4、Index圖像像素索引值(圖像像素的排列位置,範圍爲圖像的尺寸)
5、physical圖像像素物理座標(圖像像素所在的實際空間位置,可用於計算圖像中目標的實際大小)
******************************************************************************************
二、ITK的基本使用形式
itk以filter方式調用其包含的每個函數。
每個filter需要定義輸入圖像的類型,以及輸出圖像的類型,得到filtertype
下面介紹如何設置圖像類型;讀取圖像;保存圖像;讀取圖像的信息;讀取圖像的灰度值;
像素索引值與物理空間位置的變換;讀取感興趣區域(ROI);讀取圖像的最大最小灰度值
******************************************************************************************
三、代碼
////頭文件
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageRegionIterator.h"
#include "itkRegionOfInterestImageFilter.h"
#include"itkMinimumMaximumImageCalculator.h"
typedef itk::Image<short,3> ITKImageType; //圖像類型:
typedef typename ITKImageType::Pointer ITKImagePointer; //定於圖像指針
typedef typename ITKImageType::SizeType SizeType; //定義圖像尺寸類型
typedef typename ITKImageType::PixelType PixelType; //定義圖像像素灰度值類型
typedef typename ITKImageType::PointType PoingType; //定義圖像像素物理位置類型
typedef typename ITKImageType::IndexType IndexType; //定義圖像像素索引值類型
typedef typename ITKImageType::DirectionType DirectionType; //定義圖像的方向類型
int main()
{
////讀取圖像
typedef itk::ImageFilterReader<ITKImageType> ImageReaderType;
ImageReaderType::Pointer imagereaderFilter = ImageReaderType::New();
imagereaderFilter ->SetFileName(“input.nrrd”);
try
{
imagereaderFilter ->Update();
}
catch (itk::ExceptionObject & exp)
{
cerr << "read Exception caught !" << std::endl;
cerr << exp << std::endl;
}
ITKImagePointer input = imagereaderFilter ->GetOutput();//輸出的圖像
////保存圖像:
typedef itk::ImageFilterWriter<ITKImageType> ImageWriterType;
ImageWriterType::Pointer imagewriterFilter = ImageWriterType::New();
imagewriterFilter ->SetInput(input);
imagewriterFilter ->SetFileName(“output.nrrd”);
imagewriterFilter ->Update();
////讀取圖像的信息:
PixelType spacing = input->GetSpacing();
PixelType origin = input->GetOrigin();
DirectionType direction= input->GetDirection();
input->GetlargestPossibleregion().GetSize();
SizeType size = input->GetLargestPossibleRegion().GetSize();
////迭代讀取圖像的灰度值:
itk::ImageRegionIterator<ITKImageType> ItType; //定義迭代器
ItType it(input, input->GetRequestedRegion());
it.GoToBegin();
while (!it1IsAtEnd())
{
PixelType value = it.Get(); //讀取灰度值
IndexType index = it.GetIndex(); //讀取像素索引值
it.Set(1); //修改灰度值
}
////像素索引值與物理空間座標的變換
IndexType index;
index[0] =1; index[1] =1; index[2] =1;
PoingType point;
USImage->TransformIndexToPhysicalPoint(index, point); //索引值轉換成物理座標
PoingType point1;
point1[0] = 12.3; point1[1] = 12.3; point1[2] = 12.3;
IndexType index1;
USImage->TransformPhysicalPointToIndexPoint(index1, point1); //物理座標轉換成索引值
////選取圖像的感興趣區域
//OI區域起始位置
IndexType ROIstart;
ROIstart[0] = 350;
ROIstart[1] = 0;
//ROI區域大小
SizeType ROIsize;
ROIsize[0] = 1000;
ROIsize[1] = 900;
//ROI區域
ITKImageType::RegionType ROIRegion;
ROIRegion.SetSize(ROIsize);
ROIRegion.SetIndex(ROIstart);
typedef itk::RegionOfInterestImageFilter< ITKImageType, ITKImageType> RegionOfInterestImageFilterType;
RegionOfInterestImageFilterType::Pointer regioninterestfilter = RegionOfInterestImageFilterType::New();
regioninterestfilter->SetInput(input);
regioninterestfilter->SetRegionOfInterest(ROIRegion);
try
{
regioninterestfilter->Update();
}
catch (itk::ExceptionObject & exp)
{
cerr << "ROI Exception caught !" << std::endl;
cerr << exp << std::endl;
}
////得到圖像的最大灰度值和最小灰度值
typedef itk::MinimumMaximumImageCalculator <ITKImageType> IMinimumMaximumImageCalculatorType;
IMinimumMaximumImageCalculatorType::Pointer imageCalculatorFilter = IMinimumMaximumImageCalculatorType::New();
imageCalculatorFilter->SetImage(input);
imageCalculatorFilter->Compute();
PixelType max = imageCalculatorFilter->GetMaximum(); //最大值
PixelType min = imageCalculatorFilter->GetMinimum(); //最小值
return 0;
}