当前位置:网站首页>ITK 读取一个目录中的一个序列,然后改变头信息,将多张dcm图像写成一个dcm文件。
ITK 读取一个目录中的一个序列,然后改变头信息,将多张dcm图像写成一个dcm文件。
2022-08-10 22:14:00 【peanut_wu】
/ Software Guide : BeginCodeSnippet
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImage.h"
#include "itkMetaDataObject.h"
#include "itkGDCMImageIO.h"
// Software Guide : EndCodeSnippet
#include <list>
#include <fstream>
int
main(int argc, char * argv[])
{
if (argc < 5)
{
std::cerr << "Usage: " << argv[0]
<< " DicomImage OutputDicomImage Entry Value\n";
return EXIT_FAILURE;
}
// Software Guide : BeginLatex
//
// We declare the image type by selecting a particular pixel type and image
// dimension.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
using InputPixelType = short;
constexpr unsigned int Dimension = 2;
using InputImageType = itk::Image<InputPixelType, Dimension>;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We instantiate the reader type by using the image type as template
// parameter. An instance of the reader is created and the file name to be
// read is taken from the command line arguments.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
using ReaderType = itk::ImageFileReader<InputImageType>;
auto reader = ReaderType::New();
reader->SetFileName(argv[1]);
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// The GDCMImageIO object is created in order to provide the services for
// reading and writing DICOM files. The newly created image IO class is
// connected to the reader.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
using ImageIOType = itk::GDCMImageIO;
auto gdcmImageIO = ImageIOType::New();
reader->SetImageIO(gdcmImageIO);
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// The reading of the image is triggered by invoking \code{Update()} in the
// reader.
//
// Software Guide : EndLatex
try
{
// Software Guide : BeginCodeSnippet
reader->Update();
// Software Guide : EndCodeSnippet
}
catch (const itk::ExceptionObject & e)
{
std::cerr << "exception in file reader " << std::endl;
std::cerr << e.GetDescription() << std::endl;
std::cerr << e.GetLocation() << std::endl;
return EXIT_FAILURE;
}
// Software Guide : BeginLatex
//
// We take the metadata dictionary from the image that the reader had loaded
// in memory.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
InputImageType::Pointer inputImage = reader->GetOutput();
using DictionaryType = itk::MetaDataDictionary;
DictionaryType & dictionary = inputImage->GetMetaDataDictionary();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Now we access the entries in the metadata dictionary, and for particular
// key values we assign a new content to the entry. This is done here by
// taking
// \{key,value\} pairs from the command line arguments. The relevant method
// is \code{EncapsulateMetaData} that takes the dictionary and for a given
// key provided by \code{entryId}, replaces the current value with the
// content of the \code{value} variable. This is repeated for every
// potential pair present in the command line arguments.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
for (int i = 3; i < argc; i += 2)
{
std::string entryId(argv[i]);
std::string value(argv[i + 1]);
itk::EncapsulateMetaData<std::string>(dictionary, entryId, value);
}
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Now that the dictionary has been updated, we proceed to save the image.
// This output image will have the modified data associated with its DICOM
// header.
//
// Using the image type, we instantiate a writer type and construct a
// writer. A short pipeline between the reader and the writer is connected.
// The filename to write is taken from the command line arguments. The image
// IO object is connected to the writer.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
using Writer1Type = itk::ImageFileWriter<InputImageType>;
auto writer1 = Writer1Type::New();
writer1->SetInput(reader->GetOutput());
writer1->SetFileName(argv[2]);
writer1->SetImageIO(gdcmImageIO);
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Execution of the writer is triggered by invoking the \code{Update()}
// method.
//
// Software Guide : EndLatex
try
{
// Software Guide : BeginCodeSnippet
writer1->Update();
// Software Guide : EndCodeSnippet
}
catch (const itk::ExceptionObject & e)
{
std::cerr << "exception in file writer " << std::endl;
std::cerr << e.GetDescription() << std::endl;
std::cerr << e.GetLocation() << std::endl;
return EXIT_FAILURE;
}
// Software Guide : BeginLatex
//
// Remember again, that modifying the header entries of a DICOM file
// involves very serious risks for patients and therefore must be done with
// extreme caution.
//
// Software Guide : EndLatex
return EXIT_SUCCESS;
}
边栏推荐
- 使用 Cloudreve 搭建私有云盘
- camera预览流程 --- 从HAL到OEM
- Conditional Statements of Shell Programming (2)
- 学会开会|成为有连接感组织的重要技能
- shell(文本打印工具awk)
- LeetCode Daily 2 Questions 01: Reverse Strings (both 1200) Method: Double Pointer
- shell脚本
- Shell编程规范与变量
- LeetCode Daily Question (1573. Number of Ways to Split a String)
- [Maui official version] Create a cross-platform Maui program, as well as the implementation and demonstration of dependency injection and MVVM two-way binding
猜你喜欢
3598. Binary tree traversal (Huazhong University of Science and Technology exam questions)
C # Hex file transfer skills necessary article 】 【 bin file code implementation
How many threads does LabVIEW allocate?
LabVIEW分配多少线程?
OneNote tutorial, how to organize notebooks in OneNote?
阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展
常用代码扩展点设计方式
Research on multi-element N-k fault model of power system based on AC power flow (implemented by Matlab code) [Power System Fault]
xshell (sed 命令)
How to translate financial annual report, why choose a professional translation company?
随机推荐
STL-stack
水果沙拉酱
Pro-test is effective | A method to deal with missing features of risk control data
LeetCode每日两题01:反转字符串 (均1200道)方法:双指针
BM7 链表中环的入口结点
RK3399平台开发系列讲解(内核驱动外设篇)6.35、IAM20680陀螺仪介绍
What would happen if disconnecting during the process of TCP connection?
Shell 编程--Sed
新一代网络安全防护体系的五个关键特征
德科立科创板上市:年营收7.3亿 市值59亿
威纶通触摸屏如何在报警的同时,显示出异常数据的当前值?
阿里云架构师金云龙:基于云XR平台的视觉计算应用部署
Shell编程之条件语句(二)
3598. Binary tree traversal (Huazhong University of Science and Technology exam questions)
geemap的详细安装步骤及环境配置
ThreadLocal comprehensive analysis (1)
shell(文本打印工具awk)
留言有奖|OpenBMB x 清华大学NLP:大模型公开课更新完结!
商家招募电商主播要考虑哪些内容
gcc492 compile `.rodata‘ can not be used when making a PIE object; recompile with -fPIE