您的位置:首页 > 理论基础 > 数据结构算法

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

2017-04-03 20:22 381 查看
本文介绍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;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: