typedef signed short PixelType;
const unsigned int Dimension = 2;
typedef itk::Image< PixelType, Dimension > ImageType;
typedef itk::ImageSeriesReader< ImageType > ReaderType;
ReaderType::Pointer reader = ReaderType::New();
typedef itk::GDCMImageIO ImageIOType;
ImageIOType::Pointer dicomIO = ImageIOType::New();
reader->SetImageIO(dicomIO);
typedef itk::GDCMSeriesFileNames NamesGeneratorType;
NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
nameGenerator->SetInputDirectory("E:/imgdata/2013-06-04/");
using SeriesIdContainer = std::vector< std::string >;
const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
auto seriesItr = seriesUID.begin();
auto seriesEnd = seriesUID.end();
using FileNamesContainer = std::vector< std::string >;
FileNamesContainer fileNames;
std::string seriesIdentifier;
while (seriesItr != seriesEnd)
{
seriesIdentifier = seriesItr->c_str();
fileNames = nameGenerator->GetFileNames(seriesIdentifier);
++seriesItr;
}
using IteratorType = itk::ImageRegionIterator<ImageType>;
const size_t fileNum = fileNames.size();
LONG64 *pPixValue = new LONG64[512 * 512];
memset(pPixValue, 0, 512 * 512 * sizeof(LONG64));
for (size_t i = 0; i < fileNum; i++)
{
reader->SetFileName(fileNames[i]);
reader->Update();
//写DICOM文件
auto pImage = reader->GetOutput();
IteratorType it(pImage, pImage->GetLargestPossibleRegion());
it.GoToBegin();
//获取每个像素的值
int k = 0;
while (!it.IsAtEnd())
{
if (it.Get() < 800)
pPixValue[k++] += -1000;
else
pPixValue[k++] += it.Get();
++it;
}
}
reader->SetFileName(fileNames[0]);
reader->Update();
typedef itk::ImageFileWriter< ImageType > Writer1Type;
Writer1Type::Pointer writer1 = Writer1Type::New();
writer1->SetFileName("E:/test.dcm");
auto pWriterImage = reader->GetOutput();
IteratorType iter(pWriterImage, pWriterImage->GetLargestPossibleRegion());
iter.GoToBegin();
//获取每个像素的值
int k = 0;
while (!iter.IsAtEnd()) {
iter.Set(pPixValue[k++]/116);
++iter;
}
pWriterImage->Update();
writer1->SetInput(pWriterImage);
writer1->SetImageIO(dicomIO);
try
{
writer1->Update();
}
catch (itk::ExceptionObject & e)
{
std::cerr << "exception in file writer " << std::endl;
std::cerr << e << std::endl;
return ;
}