图像后处理——取图像中最大连接部分

在使用GeoS进行CT图像分割后会出现周围不规则的情况,如下图所示:

图像后处理——取图像中最大连接部分_第1张图片

以下代码是取图像中最大连接部分,从而去掉周围零散的点包括红色平面(GeoS使用时间

长了就会出现这个问题,不明原因)。

#include "itkImage.h"
#include "itkImageFileWriter.h"
#include "itkImageFileReader.h"
#include "itkImageRegionIterator.h"
#include "itkConnectedComponentImageFilter.h"
#include "itkLabelShapeKeepNObjectsImageFilter.h"
#include "itkCastImageFilter.h"

#include 
#include 

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 ImageType;
	typedef itk::Image UCharImageType;

	typedef itk::ImageFileReader 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 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 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 itLargestComponent(labelShapeKeepNObjectFilter->GetOutput(), labelShapeKeepNObjectFilter->GetOutput()->GetLargestPossibleRegion());
	while (!itLargestComponent.IsAtEnd())
	{
		if (itLargestComponent.Get())
		{
			itLargestComponent.Set(1);
		}

		itLargestComponent++;
	}

	typedef itk::CastImageFilter 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 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

图像后处理——取图像中最大连接部分_第2张图片

将所需处理的文件放到.exe所在文件目录下,然后按照命令行窗口的格式将inputImage输入

点击回车即可输出处理后的图像。



你可能感兴趣的:(imageprocessing)