一、介绍

  获取DRR图像是医疗图像配准里面的一个重要的前置步骤:它的主要目的是,通过CT三维图像,获取模拟X射线影像,这个过程也被称为数字影响重建。

  在2D/3D的配准流程里面,需要首先通过CT三维图像,能够获取任意位置的DRR图像,然后去与已经获取的X光平面图像配准。

  配准过程如下(下面的描述是不准确的,我只是描述了一种情况,即基于灰度的图像配准算法的过程,并且可能会有纰漏):

  1- 定义一个评价函数:即相似性测度函数,通过这个函数评价当前是否已经达到了配准的要求。

  2- 不断通过调整输入参数得到不同角度下的DRR图像。

  3-通过1里面的评价函数判断是否停止搜索

  实际上这是一个循环,终止条件就是是否满足相似性测度函数。

  具体流程可以参考下面的流程图:

  

二、DRR例子运行

  在ITK5.0里面有一个相关的例子,我也是跑了好久才把程序跑通的,跑通以后就觉得做了许多的无用功......

  说到底还是菜,跑一个程序就要两周,醉了(好吧,吐槽完毕^-^)

  1-找到例子,构建工程

  按照之前第一个博客的过程安装ITK之后,我们找到这个例子所在的位置:

  ITK-5.0/Examples/Filtering/DigitallyReconstructedRadiograph1.cxx

       例子的代码也可以在这里找到:

  https://itk.org/Doxygen/html/Examples_2Filtering_2DigitallyReconstructedRadiograph1_8cxx-example.html

  把这个代码复制出来单独的构建一个工程(也是按照第一个博客里面的方法),但是这个时候的工程是无法运行的。

  2- 代码第一个问题

  当我们运行程序的时候,程序无法运行, 提示说是因为没有定义一个IOFactory

  那么现在问题来了,IOFactory是和要写入的图像类型绑定的,

  我们要把这个当做什么类型的文件写入呢?

  这个时候的writer是三维图像,所以我们是不能够写成 bmp, jpg, 等等图像的,我就是在这里尝试很很多遍。

  后来我们经过观察发现,在程序里面有一个写入到文件的一个代码。

#ifdef WRITE_CUBE_IMAGE_TO_FILE
const char *filename = "body.gipl";
using WriterType = itk::ImageFileWriter< InputImageType >;
WriterType::Pointer writer = WriterType::New();
itk::GiplImageIOFactory::RegisterOneFactory();
writer->SetFileName( filename );
writer->SetInput( image ); try
{
std::cout << "Writing image: " << filename << std::endl;
writer->Update();
}
catch( itk::ExceptionObject & err )
{ std::cerr << "ERROR: ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
#endif

  最开始我根本没有观察过这个,但是后来发现是存在GiplIOFactory的,于是尝试了一下,发现就可以了。

  2.1 解决方法:

  也就是说,我们需要做两件事情:

  <1>声明一个GiplIOFactory

#include "itkGiplImageIOFactory.h"
itk::GiplImageIOFactory::RegisterOneFactory();

  <2>传入文件的写入参数,比如我传入的是 "1.gipl"  (注意这里的后缀需要时 .gipl, 需要注意如何在VS里面如何传入参数。)

  这个时候程序已经可以成功运行了,并且DRR图像被写入到了工程所在的文件夹。

2.2-图像观察

  这个时候我们已经可以观察一下这个文件到底生成了一个什么东西:

  我们通过3D  slicer打开这个gipl文件,可以观察到这个三维图像和生成的DRR图像:

  <1> 三维图像

  

  <2>DRR图像

  

  可以看到,例子自己建立的图像其实是一个中空的正方体。

  3-第二个问题

   但是我希望实现的是读取的DRR图像,所以需要读取自己的CT图像。

  目前我拥有的是一系列的CT图像,他们只是2D图像,而历程里面的reader则是读取的三维图像。

  所以需要添加代码,读取自己的CT图像,然后转换为3D图像。

  添加代码如下:

 //定义像素类型,图像类型,三维有符号数,定义指针
typedef signed short PixelType;
const unsigned int Dimension = ;
typedef itk::Image< PixelType, Dimension > ImageType;
typedef itk::ImageSeriesReader< ImageType > ReaderType; //声明读、写 DICOM 图 像 的 itk::GDCMImageIO对象
//itk::GDCMSeriesFileNames对象将生成并将构成所有体数据的切片的文件名进行排序
typedef itk::GDCMImageIO ImageIOType;
typedef itk::GDCMSeriesFileNames NamesGeneratorType;
ImageIOType::Pointer gdcmIO = ImageIOType::New();
NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New(); //设置读取路径
//用文件名发生器生成被读的文件名和被写的文件名
namesGenerator->SetInputDirectory("D:\\Files\\Data\\3219032438350584179-8\\DICOM\\S258070\\S20");
const ReaderType::FileNamesContainer& filenames = namesGenerator->GetInputFileNames(); //设置DICOM图像IO对象和被读的文件名的列表
ReaderType::Pointer reader = ReaderType::New();
reader->SetImageIO(gdcmIO);
reader->SetFileNames(filenames);

  这个就是第三个博客里面的读取程序,唉,伤心,浪费这么久。

  具体对于这个程序的参数讲解参加下一个博客六

三、参考链接

  1-博客:https://blog.csdn.net/inter_peng/article/details/52155073

  2-第一个图来源:基于灰度的二维三维图像配准方法及其在骨科导航手术中的应用

  

五、如何通过CT三维图像得到DRR图像的更多相关文章

  1. [HeadFrist-HTMLCSS学习笔记]第五章认识媒体:给网页添加图像

    [HeadFrist-HTMLCSS学习笔记]第五章认识媒体:给网页添加图像 干货 JPEG.PNG.GIF有何不同 JPEG适合连续色调图像,如照片:不支持透明度:不支持动画:有损格式 PNG适合单 ...

  2. 学习 opencv---(3) ROI 区域图像叠加&初级图像混合

    在这篇文章里,我们一起学习了在OpenCV中如何定义感兴趣区域ROI,如何使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操 ...

  3. Opencv-Python:图像尺寸、图像的读取、显示、保存与复制

    Opencv-Python:图像尺寸.图像的读取.显示.保存与复制 原创 2017年11月23日 21:30:49 4440 在使用opencv的方法时,首先必须导入opencv包.新的opencv导 ...

  4. 14、OpenCV实现图像的空间滤波——图像锐化及边缘检测

    1.图像锐化理论基础 1.锐化的概念 图像锐化的目的是使模糊的图像变得清晰起来,主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反.而且从算子可以看出来,平滑是基于对图像领域的加 ...

  5. 本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等功能

    import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  6. Ubuntu使用dense_flow提取视频图像的光流图像

    使用dense_flow求取图像的光流图像,原项目地址: https://github.com/wanglimin/dense_flow 该方法使用的是opecnv最基本的光流图像计算方法,输出为 f ...

  7. OpenCV --- 修改图像的对比度、亮度 、RGB转Gray图像、修改图像的尺寸

    #include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgu ...

  8. Windows 10 取消桌面右键“图像属性”、“图像选项”

    Windows 10 取消桌面右键"图像属性"."图像选项" 桌面右键 说明:在windows 10中,桌面右键出现"图像属性"." ...

  9. [实例]ROS使用OpenCV读取图像并发布图像消息在rviz中显示

    思路: (1)使用opencv读取本地图像 (2)调用cv_bridge::CvImage().toImageMsg()将本地图像发送给rviz显示 一.使用opencv读取本地图像并发布图像消息 ( ...

随机推荐

  1. Django开发登录功能实战

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:凡夫俗子66 Django 如果是定义函数写登录路由,需要判断请求方法 ...

  2. 【JS】小工具

    带天数的倒计时 function countDown(dateline){ var timer=null, //倒计时 current_time=Math.floor(new Date().getTi ...

  3. Linux—cat

    cat:查看文件内容 cat -A: 显示文件中一些比较特殊的符号,如行尾的$ cat -n:  显示行号包括空白行 cat -b:  显示行号不包括空白行

  4. Python3 面向对象进阶2

    目录 Classmethod Staticmethod Isinstance Issubclass 反射 概念 hasattr getattr setattr delattr 魔法方法 概念 __ne ...

  5. 大数据学习笔记——Java篇之集合框架(ArrayList)

    Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...

  6. screen虚拟终端工具

    说明:有时候我们要执行一个命令或脚本,需要几小时甚至几天,但是不能中断,有时想查看当前输出信息的时候,可以将它丢到后台运行,但是后台运行却无法显示或输出相关信息出来:我们可以使用一个虚拟终端工具scr ...

  7. 一遍文章搞清楚VO、DTO、DO、PO的概念、区别

    作者:Cat Qi 概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. DTO(Data Transfer Object):数据传输对 ...

  8. 用Python抢到回家的车票,so easy!

    “ 盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票. ​ 据悉,今年春运期间,全国铁路发送旅客人次同比将增长 8.0%.达到 4.4 亿人次. ​ 2020 年铁 ...

  9. 实验:使用GDB查看结构体在内存中的存储方式

    结构体在内存中的表示形式是怎么样的? 结构体在内存中和普通变量存储没有太大的区别. 首先我们看看,计算机如何读取普通变量:   普通变量例如int是占据4个字节,计算机读内存的时候会从起始地址开始读, ...

  10. C#中提示:当前上下文中不存在名称“ConfigurationManager”

    场景 想要在程序中获取App.config中设置的内容. 想要通过 ConfigurationManager.AppSettings[key]; 来进行获取,已经添加 using System.Con ...