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;
}