四、如何通过CT三维图像得到DRR

一、介绍

  获取DRR图像是医疗图像配准里面的一个重要的前置步骤。

  在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 = 3;
      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-第一个图来源:基于灰度的二维三维图像配准方法及其在骨科导航手术中的应用

  

原文地址:https://www.cnblogs.com/fantianliang/p/12014097.html

时间: 2024-08-03 16:17:09

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

三维图像技术与OpenGL基础理论

英文原文:3D Graphics with OpenGL Basic Theory 中文译文:三维图像技术与OpenGL基础理论 1. 计算机图像硬件 1.1 GPU(图像处理单元) 如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存). 1.2 像素和画面 任何图像显示都是基于栅格的格式.一个栅格既是一张二维的像素直角坐标网.像素具有两个属性:颜色和位置.颜色通常使用RGB(红绿蓝)来表示,典型的有用8位或者24位二进制位(真彩色)表示一种颜色.位置则用坐标(x,

OpenGL ES学习笔记(二)&mdash;&mdash;平滑着色、自适应宽高及三维图像生成

首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--OpenGL ES的基本用法.绘制流程与着色器编译>中实现了OpenGL ES的Android版HelloWorld,并且阐明了OpenGL ES的绘制流程,以及编译着色器的流程及注意事项.本文将从现实世界中图形显示的角度,说明OpenGL ES如何使得图像在移动设备上显示的更加真实.首先,物体有各种颜色

四种比较简单的图像显著性区域特征提取方法原理及实现-----&gt; AC/HC/LC/FT。

laviewpbt  2014.8.4 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享. 先从最简单的最容易实现的算法说起吧: 1. LC算法 参考论文:Visual Attention Detection in Video Sequences Using Spatiotemporal Cues. Yun Zhai and Mubarak Shah.  Pa

matlab画三维图像

当我们学习surface命令时,已经看到了三维作图的一些端倪.在matlab中我么可以调用mesh(x,y,z)函数来产生三维图像. 首先,我们用z=cos(x)sin(y)在-2pi ≤x,y≤ 2pi内的图像来看看: [x,y] = meshgrid(-2*pi:0.1:2*pi);z = cos(x).*sin(y);mesh(x,y,z),xlabel('x'),ylabel('y'),zlabel('z') 显示图像如下: 同样用mesh命令产生z = ye-(x2+y2)的三维图像:

python如何画三维图像?

python三维图像输出的代码如下所示:#画3D函数图像输出from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmimport matplotlib.pyplot as pltimport numpy as npimport mpl_toolkits.mplot3dfigure=plt.figure()#ax = Axes3D(figure)ax=figure.gca(projection="3d")x1=np.

三维图像投影变换——平行投影

(2)平行投影 [太阳光线产生的投影为平行投影] 如果把透视[投影的中心]移至[无穷远处],则各[投影线]成为[相互平行]的直线,这种投影法称为平行投影. 平行投影可以根据投影方向与投影面的夹角分成两类:正投影和斜投影1>正投影根据投影面与坐标轴的[夹角]又可分为:三视图和正轴侧图当投影面与某一坐标轴[垂直]时,得到的投影为三视图,投影方向和这个坐标轴的方向一致:否则得到的投影为正轴侧图. 『1』.三视图 1.主视图-->XOZ面(也称为V面)为投影面 由投影变换前后三维物体上点到主视图点的关

python之画三维图像

一:利用的包:(1)构建三维对象:mpl_toolkits.mplot3d里面导入Axes3D(2)数据方面操作:numpy(3)绘图工具包:matplotlib.pyplot 二:绘图:1.绘图主要分成两种情况:(1)一种是根据函数来绘制三维图(2)一种是根据三维坐标绘制散点图 2.代码一:绘制散点图(加颜色,修饰什么的省略) import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import

狄拉克锥的三维图像

石墨烯(graphene)中的狄拉克锥(Dirac cone)图形.直接按照能级公式绘图,公式参考[1]中 energy of the electrons 公式. %matlab代码 clear; gamma0=2.8; a=2.46;%晶格常数的值 xlist=linspace(-2,2,100); ylist=linspace(-2,2,100); [kx,ky]=meshgrid(xlist,ylist); %能量与波矢kx,ky的函数关系 E=sqrt((gamma0.^2).*(1+4

OpenCV2+入门系列(四):计算图像的直方图,平均灰度,灰度方差

本篇懒得排版,直接在网页html编辑器编辑 在图像处理时,我们常常需要求出图像的直方图.灰度平均值.灰度的方差,这里给出一个opencv2+自带程序,实现这些功能. 直方图 对于直方图,使用cv::calcHist函数可以求出. 原型 void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize,