DICOM图像读取,平滑,区域连接,与运算,最后写成DICOM格式图像

#include "vtkSmartPointer.h"
#include "vtkRenderWindow.h"
#include "vtkAutoInit.h"
#include "vtkRenderer.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkVolume.h"
#include "vtkGPUVolumeRayCastMapper.h"
#include "vtkVolumeProperty.h"
#include "vtkDICOMImageReader.h"
#include "vtkImageData.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkColorTransferFunction.h"
#include "vtkPiecewiseFunction.h"
#include "vtkImageActor.h"
#include "vtkInteractorStyleImage.h"
#include "itkImageToVTKImageFilter.h"
#include "itkImage.h"
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"
#include "itkImageSeriesReader.h"
#include "vtkImageViewer.h"
#include "itkNeighborhoodConnectedImageFilter.h"
#include "itkImage.h"
#include "itkImageSeriesWriter.h"
#include "itkImageSeriesWriter.h"
#include <qdebug.h>
#include "itkCastImageFilter.h"
#include "itkConnectedThresholdImageFilter.h"
#include "itkCurvatureFlowImageFilter.h"
#include "itkConfidenceConnectedImageFilter.h"
#include "itkSubtractImageFilter.h"
#include "itkMultiplyImageFilter.h"
#include "itkAndImageFilter.h"

VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingContextOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);

int main(int argc, char* argv[])
{
  

    /*---------------------------------------------------------------------------------------*/
    /*
    /*    将目录A中的文件分别读取,然后处理,然后写入目录B
    /*
    /*---------------------------------------------------------------------------------------*/
    typedef   float           InternalOneFilePixelType;
    const     unsigned int    DimensionOneFile = 2;
    typedef itk::Image< InternalOneFilePixelType, DimensionOneFile >  InternalOneFileImageType;
    typedef  itk::ImageFileReader< InternalOneFileImageType > ReaderType;
    ReaderType::Pointer readerOneFile = ReaderType::New();
    readerOneFile->SetFileName("E:/ITK/results/test80.DCM");
    
    typedef itk::GDCMImageIO           ImageIOType;
    ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
    readerOneFile->SetImageIO(gdcmImageIO);
    try
    {
        readerOneFile->Update();
    }
    catch (itk::ExceptionObject & e)
    {
        std::cerr << "exception in file reader " << std::endl;
        std::cerr << e << std::endl;
        
    }


    //平滑过滤器是使用图像类型作为模板参数实例化的。
    typedef itk::CurvatureFlowImageFilter< InternalOneFileImageType, InternalOneFileImageType >
        CurvatureFlowImageFilterTypeT;

    CurvatureFlowImageFilterTypeT::Pointer smoothingT =
        CurvatureFlowImageFilterTypeT::New();
    //声明区域生长滤波器
    typedef itk::ConnectedThresholdImageFilter< InternalOneFileImageType,
        InternalOneFileImageType > ConnectedFilterTypeT;
    //创建实例
    ConnectedFilterTypeT::Pointer connectedThresholdT = ConnectedFilterTypeT::New();

 
    //现在是时候连接一个简单的线性管道了。在管道的开头添加一个文件读取器,在结尾添加一个转换筛选器和写入程序。
    //转换浮点像素类型为整数类型需要使用转换过滤器,因为只有少数图像文件格式支持浮点类型。
    smoothingT->SetInput(readerOneFile->GetOutput());
    connectedThresholdT->SetInput(smoothingT->GetOutput());

    
    const InternalOneFilePixelType lowerThreshold =  30;
    const InternalOneFilePixelType upperThreshold =  255;


    connectedThresholdT->SetLower(lowerThreshold);
    connectedThresholdT->SetUpper(upperThreshold);
    //这个滤波器的输出是一个二值图像,除了提取的区域外,其他地方都是零值像素。使用方法选择区域内设置的强度值
    connectedThresholdT->SetReplaceValue(255);
    smoothingT->SetNumberOfIterations(2);
    smoothingT->SetTimeStep(0.125);
    smoothingT->Update();
    
    InternalOneFileImageType::IndexType index1T;
    index1T[0] = 158;
    index1T[1] = 190;
 
    connectedThresholdT->AddSeed(index1T);

    InternalOneFileImageType::IndexType index2T;
    index2T[0] = 192;
    index2T[1] = 154;
    
    connectedThresholdT->AddSeed(index2T);

    InternalOneFileImageType::IndexType index3T;
    index3T[0] = 217;
    index3T[1] = 269;
    connectedThresholdT->AddSeed(index3T);
    InternalOneFileImageType::IndexType index4T;
    index4T[0] = 381;
    index4T[1] = 192;
    connectedThresholdT->AddSeed(index4T);
    
    connectedThresholdT->Update();


    typedef unsigned short                OutputUCharPixelType;
    typedef itk::Image< OutputUCharPixelType, DimensionOneFile > OutputUCharImageType;
    typedef itk::CastImageFilter< InternalOneFileImageType, OutputUCharImageType > CastingFilterTypeT;
    CastingFilterTypeT::Pointer casterT1 = CastingFilterTypeT::New();
    CastingFilterTypeT::Pointer casterT2 = CastingFilterTypeT::New();
    typedef  itk::ImageFileWriter<  OutputUCharImageType  > WriterType;
    WriterType::Pointer writerOneFile = WriterType::New();
    writerOneFile->SetFileName("E:/ITK/results/ITKFilterTest80.DCM");
    casterT1->SetInput(connectedThresholdT->GetOutput());
    casterT1->Update();
    casterT2->SetInput(readerOneFile->GetOutput());
    casterT2->Update();

    
    
    typedef itk::AndImageFilter<OutputUCharImageType, OutputUCharImageType >    mathFilterType;
    mathFilterType::Pointer mathFilter = mathFilterType::New();
    mathFilter->SetInput1(casterT1->GetOutput());
    mathFilter->SetInput2(casterT2->GetOutput());
    mathFilter->Update();
    
    //writerOneFile->SetInput(mathFilter->GetOutput());//smoothingT->GetOutput()    
    //写入之前先用VTK显示

    typedef itk::ImageToVTKImageFilter<OutputUCharImageType> ConnectorType2D;  //connenct itk and vtk
    ConnectorType2D::Pointer connector2D = ConnectorType2D::New();
    connector2D->SetInput(mathFilter->GetOutput());
    connector2D->Update();
    vtkSmartPointer<vtkImageActor> actor =
        vtkSmartPointer<vtkImageActor>::New();
    actor->SetInputData(connector2D->GetOutput());

    vtkSmartPointer<vtkRenderer> render =
        vtkSmartPointer<vtkRenderer>::New();
    render->AddActor(actor);
    render->ResetCamera();
    render->SetBackground(1, 1, 1);

    vtkSmartPointer<vtkRenderWindow> window =
        vtkSmartPointer<vtkRenderWindow>::New();
    window->AddRenderer(render);
    window->SetSize(640, 480);
    window->SetWindowName("ImageViewer3D");
    window->Render();

    /* rwi是vtk渲染窗口交互器对象。 */
    vtkSmartPointer<vtkRenderWindowInteractor> rwi =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleImage> style1 =
        vtkSmartPointer<vtkInteractorStyleImage>::New();
    rwi->SetInteractorStyle(style1);
    rwi->SetRenderWindow(window);
    rwi->Initialize();

    rwi->Start();

//如果把typedef unsigned short OutputUCharPixelType 换成 typedef unsigned char                //OutputUCharPixelType;再把下一行放开,会出现错误图像,不放开,又会报错
//  writerOneFile->UseInputMetaDataDictionaryOff();
    writerOneFile->SetInput(mathFilter->GetOutput());

    writerOneFile->SetImageIO(gdcmImageIO);
    try
    {
        writerOneFile->Update();
    }
    catch (itk::ExceptionObject & excep)
    {
        std::cerr << "Exception caught !" << std::endl;
        std::cerr << excep << std::endl;
    }

    return 1;

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值