一、主要功能

  1、读取单张dcm图像

  2、写入单张dcm图像

  3、图像调整之后以.jpg格式写入

  4、调整之后重新以.dcm格式写入

二、代码

  

#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkGDCMImageIO.h"
#include "itkJPEGImageIOFactory.h"
int main(int argc,char *argv[])
{
//设置读取图像类型
using InputPixelType=signed short;
const unsigned int InputDimension = ;
using InputImageType=itk::Image<InputPixelType, InputDimension>;
//创建reader,设置读取的文件名
using ReaderType=itk:: ImageFileReader<InputImageType>;
ReaderType::Pointer reader = ReaderType::New();
//
reader->SetFileName("D:\\Files\\ITKFiles\\ITK-4-ReadSingleDCM\\Data\\I10.dcm");
//创建读取DCM的GDCMIOImage类
using ImageIOType =itk::GDCMImageIO;
ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
reader->SetImageIO(gdcmImageIO);
//调用Update()触发过程,放置在try-catch模块
try
{
reader->Update();
}
catch (itk::ExceptionObject& e)
{
std::cerr << "exception in file reader" << std::endl;
std::cerr << e << std::endl;
return EXIT_FAILURE;
}
//实例化一个writer保存图片
using WriterType=itk::ImageFileWriter<InputImageType>;
WriterType::Pointer writer1 = WriterType::New();
writer1->SetFileName("D:\\Files\\ITKFiles\\ITK-4-ReadSingleDCM\\Data\\result.dcm");
writer1->SetInput(reader->GetOutput());
//对writer设置合适的图像IO,告诉图像该如何写入
writer1->SetImageIO(gdcmImageIO);
//调用Update()触发程序
try
{
writer1->Update();
}
catch (itk::ExceptionObject& e)
{
std::cerr << "exception in file writer" << std::endl;
std::cerr << e << std::endl;
return EXIT_FAILURE;
}
//使用调节图像亮度滤波器对图像进行调节,使用无符号char类型
//类型转换
using WriterPixelType=unsigned char;
using WriteImageType=itk::Image<WriterPixelType,>;
using RescaleFilterType=itk::RescaleIntensityImageFilter<InputImageType, WriteImageType>;
RescaleFilterType::Pointer rescaler = RescaleFilterType::New();
rescaler->SetOutputMinimum();
rescaler->SetOutputMaximum();
//再次创建一个writer,写入到文件,这个时候文件以及变成了一个灰度图
using Writer2Type=itk::ImageFileWriter<WriteImageType>;
Writer2Type::Pointer writer2 = Writer2Type::New();
writer2 ->SetFileName("D:\\Files\\ITKFiles\\ITK-4-ReadSingleDCM\\Data\\1.jpg");
rescaler->SetInput(reader->GetOutput());
writer2->SetInput(rescaler->GetOutput());
itk::JPEGImageIOFactory::RegisterOneFactory();
try
{
writer2->Update();
}
catch (itk::ExceptionObject& e)
{
std::cerr << "Exception in file writer " << std::endl;
std::cerr << e << std::endl;
return EXIT_FAILURE;
}
//在此设置一个wirter,将调节之后的图像写入到文件
using Writer3Type=itk::ImageFileWriter<WriteImageType>;
Writer3Type::Pointer writer3 = Writer3Type::New();
writer3->SetFileName("D:\\Files\\ITKFiles\\ITK-4-ReadSingleDCM\\Data\\rescale.dcm");
writer3->SetInput(rescaler->GetOutput());
//设置图像IO,告诉writer通过GDCMImageIO输出, IO包含了DICOM的精确信息
writer3->UseInputMetaDataDictionaryOff();
writer3->SetImageIO(gdcmImageIO);
try
{
writer3->Update();
}
catch (itk::ExceptionObject& e)
{
std::cerr << "Exception in file writer " << std::endl;
std::cerr << e << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

三、注意问题

  1、我最初下载的dcm文件是没有后缀的,所以读取的时候没有.dcm后缀,但是程序也运行成功了。

  2、如果希望能够读取的是dcm图片,可以直接修改后缀(我一直觉得不修改就觉得怪怪的)

  3、rescale滤波器功能应该是缩放图片亮度(也就是灰度级,这个是我猜测的,还没有验证过)

四、未解决问题

  第四个写入的图片rescale.dcm图片,不知道为什么,在写入之后,通过dcm浏览器查看的时候,发现是全黑的,其他的都是正常的。

  这一点没有搞清楚

五、参考

  医学图像分割与配准 7.12 Page224-226

三、ITK的dcm图像读写的更多相关文章

  1. 二、ITK例子-jpg图像读写

    一.ITK的读写工作原理 在ITK里面,我们需要设置读取图像的像素类型,图像类型. 然后设置读取指针,将读取参数传入. 同时设置写指针,也将写入文件参数传入. 为了实现读写动作,我们需要构造一个IO工 ...

  2. 九、ITK-VTK混合编程--将序列dcm图像通过ITK读去并通过VTK显示出来

    一.初步介绍 上一个博客里面我记录了VTK的安装,以及相关的工程代码的构建,但是实际上上一个博客测试的代码的例子仅仅只是VTK程序的例子.而我实际上希望能够实现的是VTK和ITK混合编程. 在这里还是 ...

  3. DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像

    背景介绍: 近期项目需求,须要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发.在C++语言下,我使用的是应用最广泛的DCMTK开源库,在本专栏的起初阶段的大多数博文都是对DCMTK开源 ...

  4. Bing Maps进阶系列三:使用地图图像服务(ImageryService)

    Bing Maps进阶系列三:使用地图图像服务(ImageryService) 地图图像服务(ImageryService)提供了根据地理位置(经度和纬度)坐标和地图的缩放级别解析出对应于地图图片系统 ...

  5. 十ITK读取一张dcm图像然后通过vtk显示

    一.功能 通过ITK读取一张图片(dcm格式),然后通过vtk显示出来. 版本:VS2019 itk5.0.1 vtk 8.2.0 二.程序主要思路 1-读取dcm格式图片 2-转换为vtk可以读取的 ...

  6. 十二、ITK例程-医疗图像配准的HelloWorld程序

    一.说明 医疗图像配准是ITK的一个重要内容,而我们今天想要说的一个程序则相当于是其中的HelloWorld程序. 程序源码位置: InsightToolkit-\Examples\Registrat ...

  7. Python图像读写方法对比

    训练视觉相关的神经网络模型时,总是要用到图像的读写.方法有很多,比如matplotlib.cv2.PIL等.下面比较几种读写方式,旨在选出一个最快的方式,提升训练速度. 实验标准 因为训练使用的框架是 ...

  8. OpenCV2+入门系列(三):遍历图像的几种方法

    根据OpenCV中Mat类型的结构和内存中存储方式,此处给出三种对图像进行遍历的方法.首先给出基础的读取图片代码,在中间替换三种遍历方法即可,本文中,程序将遍历图像并将所有像素点置为255,所有运行结 ...

  9. HalconMFC(三)之打开图像_简单处理

    在VS2010中配置完halcon之后就得写个最简单的程序满足一下咱们的自信心呀! 第一步,新建MFC程序 最好是按照下面这么设置然后点击"完成",就不会报错 第二步,导出C++代 ...

随机推荐

  1. 通过Ajax的访问zuul的跨域问题解决方案

    刚开始在使用jqueryajax跨域请求zuul网关时,在后台发现一直拿不到前台请求的json数据,而前台也一直拿不到后台的响应数据.打开浏览器调试程序发现,本身ajax的POST请求统一都变成了op ...

  2. Localize UI Elements 汉化界面(本地化)

    In this lesson, you will learn the basics of localizing visible UI elements. By default, the applica ...

  3. OSG嵌入QT的简明总结

    目录 1.解决方案 2.存在问题 1) 警告提示 2) 多线程问题 3) 其他 1.解决方案 不得不说关于OSG的资料实在太零散了,搜索了很多关于OSG在QT下的解决方案,都是各有各的说法,有的说的不 ...

  4. QGIS练手 - 标注

    又熬夜了... QGIS的标注就是标签,在QGIS3.x中有了改进. 不得不说,就光速度这一项,就能把ArcMap按在地上摩擦,更别说各种高级的标注样式了——除了标注功能面板UI有点“缺审美化”就是了 ...

  5. CODING 2.0:为什么我们需要 DevOps

    CODING 在前两天的 Kubecon 2019 大会上发布了 CODING 2.0.这背后是 CODING 对研发管理和研发团队组建的思考.从 CODING 成立以来,我们一直在探索"让 ...

  6. python中 遇到的读取坑2.7和3.6版本的问题

    2.7读取,需要使用io.open 3.x使用open 使用io.open的时候路径需要使用\\ 目前io.open的文件名不能为中文

  7. MATLAB小函数:将列向量转化为0-1矩阵

    MATLAB小函数:将列向量转化为0-1矩阵 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 将列向量转化为0-1矩阵,例如 A = 1 2 1 5 3 ...

  8. 08. Go 语言包(package)

    Go 语言包(package) Go 语言的源码复用建立在包(package)基础之上.Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,必须同 ...

  9. 权限控制终于来了!Redis 6.0新特性——ACLs

    在2019年纽约的Redis Day上,Salvatore Sanfilippo(AKA Antirez)介绍了即将发布的Redis 6.0的新特性.以下是关于ACLs的内容. ACLs简介 在过去的 ...

  10. java之四种权限修饰符

    java权限修饰符piublic.protected.private.置于类的成员定义前,用来限定对象对该类成员的访问权限. 修饰符 类内部 同一个包 子类 任何地方 private yes     ...