VTK图像处理之图像数据结构

    本文介绍VTK图像数据结构。

VTK图像数据结构

  数字图像文件内容由两个部分组成:图像头信息和数据。图像头信息定义了图像的基本信息,主要包括原点位置(Origin)、像素间隔(Space)和维数(Dimension)。通过这三个参数即可以确定图像空间位置和大小。图像可以看作空间中的一个规则的网格,网格中的每个最小单元称为像素(二维)或体素(三维),网格在每个方向上的像素或体素个数即为图像在该方向的维数。像素索引表示每个像素在图像网格中的位置,是图像内部的网格坐标。对于普通的一张图像而言,z方向维数为1。
  
这里写图片描述

  图像数据即为图像像素的像素值,一般采用一维数组来表示和存储。VTK中图像数据结构由
类vtkImageData来表示。这种数据类型是结构化的,这意味着只要用很少的参数(原点位置、像素间隔和维数)就能准确定义每个数据点的位置。

VTK图像创建

图像源Source

  VTK中内置了多个创建图像的Source类,利用这些Source类可以快速创建图像,比如vtkImageGridSource用于生成网格图像。这里以vtkImageCanvasSource2D类创建一个示例。vtkImageCanvasSource2D的功能是创建了一个画布(空白图像),并提供了多种几何图形(点、线段、圆、矩形等)的绘制填充功能。
CMakeLists.txt文件代码如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(ImageCanvasSource2D)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(ImageCanvasSource2D     ImageCanvasSource2D.cpp)
TARGET_LINK_LIBRARIES(ImageCanvasSource2D ${VTK_LIBRARIES})   

ImageCanvasSource2D.cpp文件代码如下:

#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;
}

运行结果:

这里写图片描述

直接创建图像

利用图像Source可以快速地生成特定的图像,但是实际应用中用得比较少。VTK可以手动生成图像,然后根据需要进行像素赋值。
CMakeLists.txt文件代码如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(CreateVTKImageData)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(CreateVTKImageData CreateVTKImageData.cpp)
TARGET_LINK_LIBRARIES(CreateVTKImageData ${VTK_LIBRARIES})  

CreateVTKImageData .cpp文件代码如下:

#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->AllocateScalars(VTK_UNSIGNED_CHAR, 1);

    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;
}

运行结果:

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值