一、主要功能

  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. 从零开始的vue学习笔记(六)

    混入 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.简单解释就是把一个Vue组件中的内容提供给别的组件来用.例子: // 定义一个混入对象 var myMixin ...

  2. Prometheus学习系列(一)之Prometheus简介

    前言 本文来自Prometheus官网手册 和 Prometheus简介 什么是prometheus? Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包.自2012 ...

  3. 如何在 Chrome中导出、导入书签和密码

    目录 书签 密码 书签 1.导出 点击浏览器右上角的三小点,选择"书签",再选择"书签管理器",进入如下页面 点击蓝色书签栏右上角的三小点,选择"导出 ...

  4. vue中监听路由参数的变化

    在vue项目中,假使我们在同一个路由下,只是改变路由后面的参数值,期望达到数据的更新. mounted: () =>{ this.id = this.$route.query.id; this. ...

  5. 如何用web3部署智能合约

    合约示例 pragma solidity ^0.4.18; contract CallMeChallenge { bool public isComplete = false; function ca ...

  6. Android lifecyle 源码解剖 - gdutxiaoxu的博客(微信公众号 stormjun94)

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/gdutxiaoxu/article/det ...

  7. solo升级以及自动化更新的方法

    使用solo过程总涉及到更新问题,所以就在这里把solo更新的方法总结一下.希望能给小伙伴们一些帮助.如何选择更新方法主要是跟你的部署方式有关,如果你是通过 docker方式进行部署,那么你可以还可以 ...

  8. 团队项目之Scrum5

    小组:BLACK PANDA 时间:2019.11.25   每天举行站立式会议 提供当天站立式会议照片一张 2 昨天已完成的工作 2 实现文章展示页面 完善后台的编辑功能接口 今天计划完成的工作 2 ...

  9. MySQL能否授予查看存储过程定义权限给用户

    在其他RDBMS中,可以将查看某个存储过程(PROCEDURE)定义的权限给某个用户,例如在SQL Server中,可以单独将查看ProcedureName定义的权限授予UserA GRANT VIE ...

  10. Redhat Linx使用Centos yum源

    一.故障现象: 在安装了Read linux后,使用yum安装软件,出现如下提示:[root@localhost~]# yum install xxxLoaded plugins: product-i ...