在使用GeoS进行CT图像分割后会出现周围不规则的情况,如下图所示:
以下代码是取图像中最大连接部分,从而去掉周围零散的点包括红色平面(GeoS使用时间
长了就会出现这个问题,不明原因)。
#include "itkImage.h" #include "itkImageFileWriter.h" #include "itkImageFileReader.h" #include "itkImageRegionIterator.h" #include "itkConnectedComponentImageFilter.h" #include "itkLabelShapeKeepNObjectsImageFilter.h" #include "itkCastImageFilter.h" #include <iostream> #include <fstream> int main(int argc, char* argv[]) { //validate the parameters if (argc < 2) { std::cerr << "Arguments Missing." << std::endl; std::cerr << "PostprocessResampledBinaryImage.exe inputImage.nii.gz" << std::endl; return EXIT_FAILURE; } std::string sourceImageFileName = argv[1]; unsigned int position = sourceImageFileName.find_first_of('.'); unsigned int pathLength = position; std::string imageFilePath = sourceImageFileName.substr(0, pathLength); //define image type typedef itk::Image<unsigned short, 3> ImageType; typedef itk::Image<unsigned char, 3> UCharImageType; typedef itk::ImageFileReader<ImageType> ReaderType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); reader->Update(); ImageType::Pointer originalImage = reader->GetOutput(); //extract the largest connected component of original image typedef itk::ConnectedComponentImageFilter<ImageType, ImageType> ConnectedComponentFilterType; ConnectedComponentFilterType::Pointer connectedComponentFilter = ConnectedComponentFilterType::New(); connectedComponentFilter->SetInput(originalImage); try { connectedComponentFilter->Update(); } catch (itk::ExceptionObject &e) { std::cerr << "Failed to execute ConnectedComponentImageFilter!" << std::endl; std::cerr << e.GetDescription() << std::endl; } typedef itk::LabelShapeKeepNObjectsImageFilter<ImageType> LabelShapeKeepNObjectsFilterType; LabelShapeKeepNObjectsFilterType::Pointer labelShapeKeepNObjectFilter = LabelShapeKeepNObjectsFilterType::New(); labelShapeKeepNObjectFilter->SetInput(connectedComponentFilter->GetOutput()); labelShapeKeepNObjectFilter->SetBackgroundValue(0); labelShapeKeepNObjectFilter->SetNumberOfObjects(1); labelShapeKeepNObjectFilter->SetAttribute(LabelShapeKeepNObjectsFilterType::LabelObjectType::NUMBER_OF_PIXELS); try { labelShapeKeepNObjectFilter->Update(); } catch (itk::ExceptionObject &e) { std::cerr << "Failed to execute LabelShapeKeepNObjectImageFilter!" << std::endl; std::cerr << e.GetDescription() << std::endl; } //adjust the intensity of output image of LabelShapeKeepNOjbectsImageFilter itk::ImageRegionIterator<ImageType> itLargestComponent(labelShapeKeepNObjectFilter->GetOutput(), labelShapeKeepNObjectFilter->GetOutput()->GetLargestPossibleRegion()); while (!itLargestComponent.IsAtEnd()) { if (itLargestComponent.Get()) { itLargestComponent.Set(1); } itLargestComponent++; } typedef itk::CastImageFilter<ImageType, UCharImageType> CastFilterType; CastFilterType::Pointer caster = CastFilterType::New(); caster->SetInput(labelShapeKeepNObjectFilter->GetOutput()); try { caster->Update(); } catch (itk::ExceptionObject &e) { std::cerr << "Failed to cast unsigned short to unsigned char image type!" << std::endl; std::cerr << e.GetDescription() << std::endl; } UCharImageType::Pointer postprocessedImage = caster->GetOutput(); typedef itk::ImageFileWriter<UCharImageType> WriterType; WriterType::Pointer writer = WriterType::New(); std::string fileName = imageFilePath; fileName.append("_postprocessed.nii.gz"); writer->SetInput(postprocessedImage); writer->SetFileName(fileName.c_str()); try { writer->Update(); }catch(itk::ExceptionObject &e) { std::cerr << "Failed to save subtracted image under " << fileName << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } 通过在Cmake里生成project文件,所以需要相应的Cmakelist.text文件: cmake_minimum_required(VERSION 2.6) project(PostprocessResampledBinaryImage) find_package(VTK) if(VTK_FOUND) include(${VTK_USE_FILE}) else(VTK_FOUND) message(FATAL_ERROR "Can not build without VTK, please set VTK_DIR.") endif(VTK_FOUND) find_package(ITK) if(ITK_FOUND) include(${ITK_USE_FILE}) else(ITK_FOUND) message(FATAL_ERROR "Can not build without ITK, please set ITK_DIR.") endif(ITK_FOUND) add_executable(PostprocessResampledBinaryImage PostprocessResampledBinaryImage.cxx) target_link_libraries(PostprocessResampledBinaryImage ${ITK_LIBRARIES})生成后,在VS中编译即可使用。可通过cmd命令执行.exe
将所需处理的文件放到.exe所在文件目录下,然后按照命令行窗口的格式将inputImage输入
点击回车即可输出处理后的图像。
