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; }
运行结果:
相关文章推荐
- OPENcv从相机采集图像数据-图像处理接口IPLIMAGE结构的指针
- OPENcv从相机采集图像数据-图像处理接口IPLIMAGE结构的指针
- 数字图像处理基础-第五章 图像数据压缩
- libnids-1.21 中 IP 分片重组分析 之数据结构与处理流程
- VC++和VC++.NET中与图像处理有关的几个概念、结构和类
- CS结构下数据冲突处理
- 使用GDI+位图数据扫描线处理图像的小技巧
- 智能客户端体系结构与设计指南 第 2 章 — 处理数据
- opencv图像处理1--IPlImage结构分析
- key value数据对于C结构的处理
- TIF图像数据结构(转)
- HTML5灰度图像处理练习3:图像数据传输
- MYSQL图像数据的处理
- 使用GDI+位图数据扫描线处理图像的小技巧
- 树形结构的处理--数据复制
- VC++和VC++.NET中与图像处理有关的几个概念、结构和类
- 关于DataList嵌套DataList的问题(重点在于处理某些特殊结构与数据绑定)
- 树形结构的处理--数据新增,修改、删除
- Delphi图像处理 -- 图像像素结构与图像数据转换
- libnids-1.21 中 IP 分片重组分析 之数据结构与处理流程