ITK-医学图像基本信息

    xiaoxiao2025-01-06  90

    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;

    }

     

    最新回复(0)