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

一、功能

  通过ITK读取一张图片(dcm格式),然后通过vtk显示出来。

  版本:VS2019

      itk5.0.1

     vtk 8.2.0

二、程序主要思路

  1-读取dcm格式图片

  2-转换为vtk可以读取的数据类型

  3-设置显示参数,然后显示出来

三、代码

  工程构建参见前面的博客,代码部分如下:

//保证VTK正常运行
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkGDCMImageIO.h"
#include "itkImageToVTKImageFilter.h"

#include <vtkSmartPointer.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>

int main(int argc, char * argv[])
{

    //设置读取图像类型
    using PixelType=signed short;
    const unsigned int  Dimension= 2 ;
    typedef itk::Image<PixelType, Dimension> ImageType;
    typedef itk::ImageFileReader<ImageType> ReaderType;
    //读取指针
    ReaderType::Pointer reader = ReaderType::New();
    //设置读取文件
    reader->SetFileName("D:\\Files\\Data\\3219032438350584179-8\\DICOM\\S258070\\S20\\I10");
    //创建读取DCM的GDCMIOImage类
    using ImageIOType =itk::GDCMImageIO;
    ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
    reader->SetImageIO(gdcmImageIO);
    try
    {
        reader->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "exception in file reader" << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }

    //链接滤波器,转换为VTK类型
    typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
    ConnectorType::Pointer connector = ConnectorType::New();
    connector->SetInput(reader->GetOutput());
    try
    {
        connector->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "exception in file reader" << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }

    /* vtkImageActor在3D场景下渲染图像 */
    vtkSmartPointer<vtkImageActor> actor = vtkImageActor::New();
    actor->SetInputData(connector->GetOutput());
    actor->InterpolateOff();
    actor->Update();

    vtkSmartPointer<vtkRenderer> render = vtkRenderer::New();
    render->AddActor(actor);
    render->SetBackground(255, 1, 1);//设置窗口背景颜色

    vtkSmartPointer<vtkRenderWindow> window = vtkRenderWindow::New();
    window->SetSize(600, 600);       //设置窗口大小
    window->AddRenderer(render);
    window->SetWindowName("the CT picture ");//设置窗口名称

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkRenderWindowInteractor::New();
    interactor->SetRenderWindow(window);

    interactor->Initialize();
    interactor->Start();
    return 0;
}

四、结果显示

  在这里注意,我发现如果设置的读取的读片类型不同,显示的效果会有差异:

  比如如果图片格式是:

//设置读取图像类型
    using PixelType=unsigned char;
    const unsigned int  Dimension= 2 ;
    typedef itk::Image<PixelType, Dimension> ImageType;

  图片效果如下:

  

  如果图片格式设置如下:

    //设置读取图像类型
    using PixelType=signed short;
    const unsigned int  Dimension= 2 ;
    typedef itk::Image<PixelType, Dimension> ImageType;    

  图片显示如下:

  

  感觉都不是很清晰。

五、参考文献

  关于vtk如何现实图片:https://blog.csdn.net/shenziheng1/article/details/54565337

  代码主要来源:https://blog.csdn.net/cuihaolong/article/details/53943981

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

时间: 2024-10-03 02:42:07

十ITK读取一张dcm图像然后通过vtk显示的相关文章

ITK读取CT DICOM,如何设置窗位和窗宽?

关键字: dicom itk CT 不清晰 窗位 窗宽 碎碎念: 最近忽然要用到ITK读取DICOM,在听到任务之前,我连ITK和DICOM是个啥东西都不知道.当然,刚听到任务的时候,我脑子里也只有"这特码是啥?""这特码又是啥?"... 在被进度恶心了几天之后,对这些概念我大概有了些认识.然后在试图将DICOM显示成jpeg时候,按照guide里的例子改了改,结果发现JPEG的图像呈现灰蒙蒙的感觉,完全不如另一款软件读出的清晰. 尝试过程中,由于概念认识有限,搜索

code第一部分数组:第十五题 矩阵翻转(图像翻转)

code第一部分数组:第十五题 矩阵翻转(图像翻转) 首先想到,纯模拟,从外到内一圈一圈的转,但这个方法太慢.如下图,首先沿着副对角线翻转一次,然后沿着水平中线翻转一次. 源代码 #include <iostream> #include <vector> using namespace std; //引用类型形参 void swap(int &n,int &m) { int temp=n; n=m; m=temp; } //指针类型形参 void swap1(int

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

背景: 上周通过单步调试,找出了开源库mDCM与DCMTK在对DICOM图像进行JPEG无损压缩时的细小区别,并顺利实现了在C++和C#环境下对DICOM图像的压缩.但是问题接踵而至啊,随着项目的深入,发现在单独的测试工程中可以实现的mDCM版本,在嵌入到项目整体中后,却意外地出现了错误,并未顺利实现DICOM图像的JPEG无损压缩.因此需要继续详细对比分析mDCM与DCMTK两者,期望寻找原因. 问题分析: 开启项目的日志功能后,得到的信息反馈为: No registered codec fo

关于微信玩十人拼三张游戏作弊器透视辅助外挂,辅助器使用方法

关于微信玩十人拼三张游戏作弊器透视辅助外挂,辅助器使用方法[微信号:qqgkj0130 无丨法乄丨打丨开 打不开请添加微信][此乄乄信乄息乄永久乄有乄乄效][薇.信已开通]以实力求生存,以信誉求发展]"台美"日趋频繁热络联系 国台办:会自食其果联最新汽车遥控拦截 器怎么购买文基.金"的招募材料称,其所募资金主要用于获取南开国有资产经营有限(下称"南开国资")的80%股权,进行天津南开光电子城项目的一级土地整理,并以土地出让收入作为还款来源.2014年9月以

读取多张MNIST图片与利用BaseEstimator基类创建分类器

读取多张MNIST图片 在读取多张MNIST图片之前,我们先来看下读取单张图片如何实现 每张数字图片大小都为28 * 28的,需要将数据reshape成28 * 28的,采用最近邻插值,如下 def plot_digit(data): img = data.reshape(28,28) plt.imshow(img,cmap=matplotlib.cm.binary,interpolation='nearest') plt.axis('off') import matplotlib.pyplot

【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析

了解过之前老版本OpenCV的童鞋们都应该清楚,对于OpenCV1.0时代的基于 C 语言接口而建的图像存储格式IplImage*,如果在退出前忘记release掉的话,就会造成内存泄露.而且用起来超级麻烦,我们往往在debug的时候,很大一部分时间在纠结手动释放内存的问题.虽然对于小型的程序来说手动管理内存不是问题,但一旦我们写的代码变得越来越庞大,我们便会开始越来越多地纠缠于内存管理的问题,而不是着力解决你的开发目标. 这,就有些舍本逐末的感觉了. 而自从OpenCV踏入2.0时代,用Mat

JAVA基础-输入输出:1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上。

1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上. package Test03; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOExceptio

OpenCV Python教程(1、图像的载入、显示和保存)

本文转载自 OpenCV Python教程(1.图像的载入.显示和保存)     作者 Daetalus 本文是OpenCV  2 Computer Vision Application Programming Cookbook读书笔记的第一篇.在笔记中将以Python语言改写每章的代码. PythonOpenCV的配置这里就不介绍了. 注意,现在OpenCV for Python就是通过NumPy进行绑定的.所以在使用时必须掌握一些NumPy的相关知识! 图像就是一个矩阵,在OpenCV fo

ImageSwitcher (图像切换器,显示图片)

ImageSwitcher继承了ViewSwitcher,主要在切换图片时加入动画效果 使用方法: 1.为ImageSwitcher提供一个ViewFactory,该ViewFactory生成的View组件必须是ImageView 2.切换图片时,用到的3个方法:imageSwitcher.setImageDrawable(Drawable drawable);  imageSwitcher.setImageResource(int resid);  imageSwitcher.setImage