ITK 使用蒙版进行非二值化分割itkMaskImageFilter

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkMetaDataDictionary.h"
#include "itkImageToVTKImageFilter.h"
#include "itkImageFileWriter.h"
#include "itkGDCMImageIO.h"
#include "itksys/SystemTools.hxx"
#include "itkConnectedThresholdImageFilter.h"
#include "itkMaskImageFilter.h"
#include "itkMetaDataObject.h"


#include "vtkImageViewer.h"
#include "vtkImageActor.h"
#include "vtkRenderer.h"
#include "vtkInteractorStyleImage.h"
#include "vtkAutoInit.h"
#include "vtkSmartPointer.h"
#include "vtkRenderWindowInteractor.h"

#include <iostream>
#include <string>
#include <sstream>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingContextOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
using namespace std;

int main(int argc, char *argv[])
{
    const unsigned int Dimension = 2;
    typedef signed short                       PixelType;
    typedef itk::Image<PixelType, Dimension>     InputImageType;
    typedef itk::ImageFileReader<InputImageType> ReaderType;
    
//    for (int num = 0; num<214; num++)
    {
        std::string  inputFilename = "E:\\ITK\\results\\test80.DCM";
        std::string  outputFilename = "E:\\ITK\\results\\component.DCM";

        
        itk::GDCMImageIO::Pointer gdcmimage = itk::GDCMImageIO::New();
        ReaderType::Pointer reader = ReaderType::New();
        reader->SetImageIO(gdcmimage);
        reader->SetFileName(inputFilename);
        reader->Update();
        
        typedef itk::MetaDataDictionary DictionaryType;

        DictionaryType& dictionary = gdcmimage->GetMetaDataDictionary();

        typedef itk::ConnectedThresholdImageFilter<InputImageType, InputImageType> ConnectedImageFilter;
        ConnectedImageFilter::Pointer connectedFilter = ConnectedImageFilter::New();

        connectedFilter->SetInput(reader->GetOutput());

        connectedFilter->SetLower(30);
        connectedFilter->SetUpper(1000);
        InputImageType::IndexType index;
        index[0] = 215;
        index[1] = 256;
        connectedFilter->SetSeed(index);
        
        connectedFilter->SetReplaceValue(255);

        typedef itk::MaskImageFilter<InputImageType, InputImageType> MaskFilterType;
        MaskFilterType::Pointer maskFilter = MaskFilterType::New();
        maskFilter->SetInput(reader->GetOutput());
        maskFilter->SetMaskImage(connectedFilter->GetOutput());
        typedef itk::MetaDataObject< std::string > MetaDataStringType;
        DictionaryType::ConstIterator iter = dictionary.Begin();
        DictionaryType::ConstIterator end = dictionary.End();
        while (iter != end)
        {
            itk::MetaDataObjectBase::Pointer entry = iter->second;
            MetaDataStringType::Pointer entryvalue =
                dynamic_cast<MetaDataStringType *>(entry.GetPointer());
            if (entryvalue)
            {
                std::string tagkey = iter->first;
                std::string tagvalue = entryvalue->GetMetaDataObjectValue();
                std::cout << "(" << tagkey << ") " << tagvalue.c_str() << std::endl;
            }

            iter++;
        }


        //写入之前先用VTK显示
        typedef itk::ImageToVTKImageFilter<InputImageType> ConnectorType2D;  //connenct itk and vtk
        ConnectorType2D::Pointer connector2D = ConnectorType2D::New();
        connector2D->SetInput(maskFilter->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  itk::ImageFileWriter< InputImageType  > WriterType;
        WriterType::Pointer writer = WriterType::New();
        writer->SetImageIO(gdcmimage);
        writer->SetFileName(outputFilename);
        writer->SetInput(maskFilter->GetOutput() );
        try
        {
            writer->Update();
        }
        catch (itk::ExceptionObject & excep)
        {
            std::cerr << "Exception caught !" << std::endl;
            std::cerr << excep << std::endl;
        }
        
    }
    
     return EXIT_SUCCESS;
}

原图

分割后的图

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值