版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu253/article/details/81480767
在做科研过程中,需要将手动分割好的两幅肾脏二值图像合并成一张图像,图像格式为mhd文件,以下代码可实现其目的:
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageRegionIterator.h"
#include <string>
int main(int argc, char ** argv)
{
if (argc < 4)
{
std::cerr << "Usage: " << std::endl;
std::cerr << argv[0] << "InputImageFile OutputImageFile InLabel OutLabel" << std::endl;
return EXIT_FAILURE;
}
typedef unsigned short PixelType;
const unsigned int Dimension = 3;
const char * inputFileName1 = argv[1];
const char * inputFileName2 = argv[2];
const char * outputFileName = argv[3];
typedef itk::Image<PixelType, Dimension> InputImageType;
typedef itk::Image<PixelType, Dimension> MergedImageType;
typedef itk::ImageFileReader<InputImageType> ReaderType;
ReaderType::Pointer reader1 = ReaderType::New();
reader1->SetFileName(inputFileName1);
reader1->Update();
ReaderType::Pointer reader2 = ReaderType::New();
reader2->SetFileName(inputFileName2);
reader2->Update();
InputImageType::Pointer inputImage1 = reader1->GetOutput();
InputImageType::Pointer inputImage2 = reader2->GetOutput();
MergedImageType::Pointer mergedImage = MergedImageType::New();
mergedImage->SetRegions(inputImage1->GetLargestPossibleRegion());
mergedImage->SetOrigin(inputImage1->GetOrigin());
mergedImage->SetDirection(inputImage1->GetDirection());
mergedImage->SetSpacing(inputImage1->GetSpacing());
mergedImage->Allocate();
typedef itk::ImageRegionIterator<InputImageType> IteratorType;
IteratorType inputImageIterator1(inputImage1, inputImage1->GetLargestPossibleRegion());
IteratorType inputImageIterator2(inputImage2, inputImage2->GetLargestPossibleRegion());
IteratorType mergedImageIterator(mergedImage, mergedImage->GetLargestPossibleRegion());
inputImageIterator1.GoToBegin();
inputImageIterator2.GoToBegin();
mergedImageIterator.GoToBegin();
while (!inputImageIterator1.IsAtEnd())
{
PixelType pixel1 = inputImageIterator1.Get();
PixelType pixel2 = inputImageIterator2.Get();
if (pixel1 != 0 || pixel2 != 0)
{
mergedImageIterator.Set(1);
}
else
{
mergedImageIterator.Set(0);
}
++inputImageIterator1;
++inputImageIterator2;
++mergedImageIterator;
}
typedef itk::ImageFileWriter<MergedImageType> WriterType;
WriterType::Pointer writer = WriterType::New();
writer->SetFileName(outputFileName);
writer->SetInput(mergedImage);
try
{
writer->Update();
}
catch (itk::ExceptionObject &err)
{
std::cerr << "ExceptionObject Caught!!!" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}