获取DICOM图像的每一个像素,[处理后]写成另外一张DICOM图像

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 ;
	}
	

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值