【QT+VTK 学习笔记】06:VTK图像创建、图像显示

前言

“VTK图形图像开发进阶_张晓东_罗火灵”的学习笔记。
东灵工作室 教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686

学习资料

VTK官网学习地址:https://vtk.org/doc/nightly/html/

学习笔记

VTK图像数据结构
数字图像文件内容由两个部分组成:图像头信息和数据。图像头信息定义了图像的基本 信息,主要包括起点位置、像素间隔和维数。通过这三个 参数即可确定图像空间位置和大小。在医学图像中,起点位置、像素间隔和图像维数决定了世界坐标系。这样通过起点位 置、像素间隔和像素索引可以算出每个像素的世界空间坐标系。
VTK图像创建
图像源Source
除了 vtkImageCanvasSource2D外,VTK还提供了其他类似的Source类来快速生成特定 的图像,例如vtklmageEllipsoidSource,该类根据指定的中心以及各个轴的半径来生成一个前景为椭圆(球)的二值图像;vtklmageGaussianSource类生成一幅像素值服从高斯分布的图像; vtklmageGridSource用于生成网格线图像:vtklmageNoiseSource生成一个像素值为随机数的噪 声图像;vtklmageSinusoidSource生成的图像像素值由正弦函数决定。
程序源码 绘制两个矩形
在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)


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

int main()
{
    vtkSmartPointer<vtkImageCanvasSource2D> canvas =
        vtkSmartPointer<vtkImageCanvasSource2D>::New();
    canvas->SetScalarTypeToUnsignedChar();
    canvas->SetNumberOfScalarComponents(1);
    canvas->SetExtent(0, 100, 0, 100, 0, 0);
    canvas->SetDrawColor(0, 0, 0, 0);
    canvas->FillBox(0,100,0,100);
    canvas->SetDrawColor(255, 0, 0, 0);
    canvas->FillBox(20,40,20,40);
    canvas->Update();

    // Create actors
    vtkSmartPointer<vtkImageActor> redActor =
        vtkSmartPointer<vtkImageActor>::New();
    redActor->SetInputData(canvas->GetOutput());

    // Define viewport ranges
    // (xmin, ymin, xmax, ymax)
    double redViewport[4] = {0.0, 0.0, 1.0, 1.0};
    // Setup renderers
    vtkSmartPointer<vtkRenderer> redRenderer =
        vtkSmartPointer<vtkRenderer>::New();
    redRenderer->SetViewport(redViewport);
    redRenderer->AddActor(redActor);
    redRenderer->ResetCamera();
    redRenderer->SetBackground(1.0, 1.0, 1.0);

    // Setup render window
    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(redRenderer);
    renderWindow->SetSize( 640, 480 );
    renderWindow->Render();
    renderWindow->SetWindowName("ImageCanvasSource2D");

    // Setup render window interactor
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleImage> style =
        vtkSmartPointer<vtkInteractorStyleImage>::New();

    renderWindowInteractor->SetInteractorStyle(style);
    // Render and start interaction
    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderWindowInteractor->Initialize();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

直接创建图像
在程序中对像素赋值
程序源码 设置一个渐变色灰度图像
在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)


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

int main()
{
    vtkSmartPointer<vtkImageData> img =  vtkSmartPointer<vtkImageData>::New();
    img->SetDimensions(16,16,1);
//	img->SetScalarTypeToUnsignedChar();
//	img->SetNumberOfScalarComponents(1);
//	img->AllocateScalars();
    //分配内存,第一个参数设置像素数据类型,第二个参数设置每个像素值的组分数。
    //图像生成后,默认所有像素值为零
    img->AllocateScalars(VTK_UNSIGNED_CHAR, 1);

    //调用AllocateScalars分配内存,生成图像数据。图像生成后,默认所 有像素值为0
    //可以通过访问图像数据数组来设置每个像素值,vtklmageData:: GetScalarPointer() 即返回图像的数据数组
    unsigned char *ptr = (unsigned char*)img->GetScalarPointer();
    for(int i=0; i<16*16*1; i++)
    {
        *ptr ++ =i%256;
    }

    vtkSmartPointer<vtkImageActor> redActor =
        vtkSmartPointer<vtkImageActor>::New();
    redActor->SetInputData(img);

    double redViewport[4] = {0.0, 0.0, 1.0, 1.0};

    vtkSmartPointer<vtkRenderer> redRenderer =
        vtkSmartPointer<vtkRenderer>::New();
    redRenderer->SetViewport(redViewport);
    redRenderer->AddActor(redActor);
    redRenderer->ResetCamera();
    redRenderer->SetBackground(1.0, 1.0, 1.0);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(redRenderer);
    renderWindow->SetSize( 640, 480 );
    renderWindow->Render();
    renderWindow->SetWindowName("CreateVTKImageData");

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleImage> style =
        vtkSmartPointer<vtkInteractorStyleImage>::New();
    renderWindowInteractor->SetInteractorStyle(style);

    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderWindowInteractor->Initialize();
    renderWindowInteractor->Start();
    return EXIT_SUCCESS;
}

VTK图像显示

窗宽/窗位的概念
窗宽是图像显示的灰度范围。
一般显示器的灰度范围为256级,而医学图像的灰度范围则远远大于该范围,因此通过显示器显示时不能显示所有灰度级,需要使用窗宽来定义欲显 示的灰度范围。当灰度值高于该范围的最大值时,均以白影显示:当低于该范围时,均以黑 色显示。若增大窗宽,则显示具有不同灰度值的组织结构增多,但是会降低组织之间的对比 度,若减小窗宽,则可视的不同灰度组织结构会减少,同时增大组织结构的对比度。
窗位是窗宽的中心位置。
比如,窗宽为200,当窗位为100时,可视灰度范围为。0〜200;当窗位为500时,可视灰度范围为400〜600。当窗宽窗位确定以后,显示时底层会将可视灰度范围 转换到256灰度级进行显示。
在这里插入图片描述
医学图像二维视图
切片(Slice)或切面是三维图像比较常用的概念,尤其在医学图像中,不同方向的切面 都有特定的名字(见图5-6),分别是:
矢状面(Sagital Plane),沿着身体前后径所做的与地 面垂直的切面;
冠状面(Coronal Plane),沿着身体左右径所做的与地面垂直的切面:
横断面 (Transverse/Axial Plane),是指横断身体与地面平行的切面。
设置切片的方向即是通过不同的 方向来观察人体内部组织结构。
在这里插入图片描述

vtkImageViewer2 显示二维图像
vtkImageViewer2 中封装了 VTK 图像 显示的可视化渲染引擎,包括 vtkActor、vtkRender, vtkRenderWindow> vtklnteractorStypelmage 等对象,可以方便地完成图像显示和交互。该类提供的主要交互操作有图像放缩、窗宽窗位调节,并提供切片选择及切片方向设置接口,尤其是三维图像的切片显示。
在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)


#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkMetaImageReader.h>

//测试图像:../data/brain.mhd
int main(int argc, char* argv[])
{
    vtkSmartPointer<vtkMetaImageReader> reader =
        vtkSmartPointer<vtkMetaImageReader>::New();
    reader->SetFileName("C:/Users/jbyyy/Desktop/work/QTDEMO/jbyyy/VTK/学习资料/VTK图形图像开发进阶+张晓东+PDF+源码/VTK图形图像开发进阶随书代码/VTK图形图像开发进阶随书代码/Examples/Chap05/data/brain.mhd");
    reader->Update();

    vtkSmartPointer<vtkImageViewer2> imageViewer =
        vtkSmartPointer<vtkImageViewer2>::New();
    imageViewer->SetInputConnection(reader->GetOutputPort());

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    imageViewer->SetupInteractor(renderWindowInteractor);

    imageViewer->SetColorLevel(500);		//设置窗位
    imageViewer->SetColorWindow(2000);		//设置窗宽
    imageViewer->SetSlice(40);				//切片索引
    imageViewer->SetSliceOrientationToXY(); //切片方向垂直于XY平面:沿着Z轴方向,也是默认情况
    imageViewer->Render();

    imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
    imageViewer->SetSize(640, 480);
    imageViewer->GetRenderWindow()->SetWindowName("DisplayImageExample");

    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

在渲染窗口中,按下鼠标左键拖动鼠标,可以调节图像的窗宽窗位,从而显示不同灰度 范围内容;按下鼠标右键拖动鼠标可以缩放图像。当然,这些交互操作可以由用户根据需要 自己定义vtklnteractorStyle子类,并响应相应的操作。

vtklmageActor
vtklmageActor是一个三维图像渲染Actor.通过纹理映射将图像映射到一个多边形上进行显示。
在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)


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

//测试图像:../data/lena.bmp
int main(int argc, char* argv[])
{
    vtkSmartPointer<vtkBMPReader> reader =
        vtkSmartPointer<vtkBMPReader>::New();
    reader->SetFileName ( "C:/Users/jbyyy/Desktop/work/QTDEMO/jbyyy/VTK/学习资料/VTK图形图像开发进阶+张晓东+PDF+源码/VTK图形图像开发进阶随书代码/VTK图形图像开发进阶随书代码/Examples/Chap05/data/lena.bmp" );
    reader->Update();

    vtkSmartPointer<vtkImageActor> imgActor =
        vtkSmartPointer<vtkImageActor>::New();
    imgActor->SetInputData(reader->GetOutput());

    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(imgActor);
    renderer->SetBackground(1.0, 1.0, 1.0);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize( 640, 480 );
    renderWindow->Render();
    renderWindow->SetWindowName("DisplayImageExample2");

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleImage> style =
        vtkSmartPointer<vtkInteractorStyleImage>::New();

    renderWindowInteractor->SetInteractorStyle(style);
    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderWindowInteractor->Initialize();

    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

该例中使用 vtkBMPReader 读入图像后,依次建立 vtkImageActor、 vtkRender、vtkRenderWindow 和 vtkRenderWindowInteractor,并组装为渲染管线。然后建立 vtklnteractorStylelmage 对象,一通过renderWindowInteractor->SetInteractcrStyle(style)设置交互类型对象。需要注意vtklmageActor接收的图像数据vtklmageData像素类型必须为unsigned char,如果类型不符合要求,在显示图像前需要先将图像数据类型转换为unsigned char。
图像融合
图像融合是利用图像的不透明度来合成图像。在VTK中,用类vtklmageBlend实现图像的融合。
在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)

#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkImageBlend.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkJPEGReader.h>
#include <vtkImageActor.h>
#include <vtkImageCast.h>

//测试图像:../data/lena-gray.jpg
int main(int argc, char* argv[])
{
    vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();
    reader->SetFileName ( "C:/Users/jbyyy/Desktop/work/QTDEMO/jbyyy/VTK/学习资料/VTK图形图像开发进阶+张晓东+PDF+源码/VTK图形图像开发进阶随书代码/VTK图形图像开发进阶随书代码/Examples/Chap05/data/lena-gray.jpg" );
    reader->Update();

    vtkSmartPointer<vtkImageCanvasSource2D> imageSource = vtkSmartPointer<vtkImageCanvasSource2D>::New();
    imageSource->SetNumberOfScalarComponents(1);
    imageSource->SetScalarTypeToUnsignedChar();
    imageSource->SetExtent(0, 512, 0, 512, 0, 0);
    imageSource->SetDrawColor(0.0);
    imageSource->FillBox(0, 512, 0, 512);
    imageSource->SetDrawColor(255.0);
    imageSource->FillBox(100,400,100,400);
    imageSource->Update();

    vtkSmartPointer<vtkImageBlend> imageBlend = vtkSmartPointer<vtkImageBlend>::New();
    imageBlend->AddInputData(reader->GetOutput());
    imageBlend->AddInputData(imageSource->GetOutput());
    imageBlend->SetOpacity(0, 0.4);
    imageBlend->SetOpacity(1, 0.6);		//1不透明
    imageBlend->Update();

    // Create actors
    vtkSmartPointer<vtkImageActor> originalActor1 = vtkSmartPointer<vtkImageActor>::New();
    originalActor1->SetInputData(reader->GetOutput());

    vtkSmartPointer<vtkImageActor> originalActor2 = vtkSmartPointer<vtkImageActor>::New();
    originalActor2->SetInputData(imageSource->GetOutput());

    vtkSmartPointer<vtkImageActor> blendActor = vtkSmartPointer<vtkImageActor>::New();
    blendActor->SetInputData(imageBlend->GetOutput());

    // Define viewport ranges
    // (xmin, ymin, xmax, ymax)
    double leftViewport[4] = {0.0, 0.0, 0.33, 1.0};
    double midViewport[4] = {0.33, 0.0, 0.66, 1.0};
    double rightViewport[4] = {0.66, 0.0, 1.0, 1.0};

    // Setup renderers
    vtkSmartPointer<vtkRenderer> originalRenderer1 = vtkSmartPointer<vtkRenderer>::New();
    originalRenderer1->SetViewport(leftViewport);
    originalRenderer1->AddActor(originalActor1);
    originalRenderer1->ResetCamera();
    originalRenderer1->SetBackground(1.0, 1.0, 1.0);

    vtkSmartPointer<vtkRenderer> originalRenderer2 = vtkSmartPointer<vtkRenderer>::New();
    originalRenderer2->SetViewport(midViewport);
    originalRenderer2->AddActor(originalActor2);
    originalRenderer2->ResetCamera();
    originalRenderer2->SetBackground(1.0, 1.0, 1.0);

    vtkSmartPointer<vtkRenderer> blendRenderer = vtkSmartPointer<vtkRenderer>::New();
    blendRenderer->SetViewport(rightViewport);
    blendRenderer->AddActor(blendActor);
    blendRenderer->ResetCamera();
    blendRenderer->SetBackground(1.0, 1.0, 1.0);

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(originalRenderer1);
    renderWindow->AddRenderer(originalRenderer2);
    renderWindow->AddRenderer(blendRenderer);
    renderWindow->SetSize( 640, 320 );
    renderWindow->Render();
    renderWindow->SetWindowName("ImageBlendExample");

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
    renderWindowInteractor->SetInteractorStyle(style);
    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderWindowInteractor->Initialize();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT是一个跨平台的C++图形界面应用程序框架,VTK是一个用于可视化和图形处理的开源库,而PRO脚本则是为了编写QTVTK程序而设计的脚本语言。 在使用QTVTK开发可视化应用程序时,PRO脚本可以帮助我们简化代码编写和操作。 在编写QT VTK程序时,PRO脚本可以用来管理程序的构建过程。我们可以编写一个.pro文件,其中包含编译、链接和运行程序所需的信息和指令。PRO脚本可以指定程序所依赖的库、头文件的路径和源文件的位置等等。通过简单地修改.pro文件,我们就可以非常方便地修改程序的编译和链接选项。 此外,PRO脚本还可以用来配置QTVTK程序的构建环境。我们可以通过指定不同的编译器、库和路径来定制程序的运行环境。PRO脚本可以帮助我们在不同的平台上使用相同的代码进行构建。 在QTVTK程序中,使用PRO脚本可以提高代码的可维护性和可重用性。我们可以将一些公共的编译和链接选项抽象为变量,在不同的项目中进行复用。此外,PRO脚本还可以定义自定义的构建目标,以及一些自定义的构建规则。 总之,QT VTK PRO脚本是用于编写QTVTK程序时的一种工具。它可以帮助我们管理程序的构建过程和配置环境,提高代码的可维护性和可重用性,使我们能够更方便地开发和调试可视化应用程序。 ### 回答2: Qt VTK Pro脚本是用于在Qt框架中集成VTK(Visualization Toolkit)库的一种脚本。VTK是一个用于三维可视化、图像处理和计算几何方面的开源工具包,提供了丰富的功能和算法用于处理和呈现三维数据。 Qt VTK Pro脚本主要用于简化在Qt应用程序中使用VTK库的过程。它提供了一种方便的方法来创建和管理VTK对象、渲染场景、添加交互功能等。使用该脚本,开发人员可以更轻松地将VTK功能集成到他们的Qt应用程序中。 通过Qt VTK Pro脚本,开发人员可以使用VTK创建各种类型的3D图形,包括几何体、图像数据、曲线、体积数据等。它还提供了各种渲染技术,如体积渲染、剖面渲染、表面渲染等。 此外,Qt VTK Pro脚本还支持用户交互,允许用户与创建的3D图形进行交互。这可以通过添加鼠标事件、键盘事件等来实现。用户可以旋转、平移、缩放图形,选择对象、改变物体的属性等。 总之,Qt VTK Pro脚本为开发人员提供了一种快速、简便的方式来在他们的Qt应用程序中集成VTK库,从而使他们能够利用VTK的强大功能来处理和呈现三维数据。它使得开发3D可视化应用程序变得更加高效和灵活。 ### 回答3: Qt VTK Pro 脚本是一个用于与QtVTK和Pro软件集成的脚本。 Qt是一个跨平台的C++图形用户界面开发框架,它提供了丰富的GUI组件和工具,使开发人员能够方便地创建功能强大的应用程序。 VTK(Visualization Toolkit)是一个用于可视化和图形处理的开源软件库。它提供了许多可用于创建复杂可视化效果的算法和工具。 Pro是一种为软件项目管理而设计的构建工具。它提供了一种简单且强大的方式来构建、部署和管理软件项目。 Qt VTK Pro脚本的目的是将QtVTK和Pro集成在一起,以便更方便地开发、构建和管理应用程序。 通过使用Qt VTK Pro脚本,开发人员可以使用Qt的GUI组件来构建应用程序的用户界面。他们还可以使用VTK的算法和工具来创建复杂的可视化效果。同时,Pro工具使开发人员能够更轻松地构建、部署和管理他们的应用程序。 Qt VTK Pro脚本的使用可以在许多领域发挥作用。例如,在科学可视化中,它可以用于创建漂亮的3D可视化效果。在工程领域,它可以用于可视化和分析复杂的CAD数据。在医学图像处理中,它可以用于创建精确的医学图像可视化。 总之,Qt VTK Pro 脚本提供了一个强大的工具集,使开发人员能够更方便地将QtVTK和Pro集成在一起,从而创建出功能丰富、具有复杂可视化效果的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值