颜色映射是标量算法的一种,是应用最为广泛的可视化算法,该算法的核心是将数据集的属性数据和颜色表中的颜色相互对应,并用所对应的颜色绘制标量数据。
颜色映射的过程主要包括以下步骤:

1)定义颜色表,在颜色表中用数组保存所定义的颜色组分(红、绿、蓝)。2)将颜色表和属性数据关联。3)根据属性数据的最大、最小值建立颜色索引

颜色映射的目的是突出显示数据集中重要的属性数据,因此如何设计颜色表中的颜色,达到颜色映射的目的是颜色映的关键,一般情况下,使用灰度颜色,能提供更好的表现细节,使用彩色颜色能增强对比度。

图像彩色映射

图像彩色映射的原理是:先生成一个颜色查找表,然后根据图像像素的一个标量值在颜色查找表中查找对应的颜色,并用新颜色值替代原来的像素值,用vtkLookUpTable 生成颜色查找表,以下代码展示如何进行彩色映射。

#include <vtkVersion.h>
#include <vtkSmartPointer.h>#include <vtkActor.h>
#include <vtkDelaunay2D.h>
#include <vtkLookupTable.h>
#include <vtkMath.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkVertexGlyphFilter.h>
#include <vtkXMLPolyDataWriter.h>// For compatibility with new VTK generic data arrays
#ifdef vtkGenericDataArray_h
#define InsertNextTupleValue InsertNextTypedTuple
#endifint main(int, char *[])
{// Create a grid of points (height/terrian map)vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();unsigned int GridSize = 20;double xx, yy, zz;//随机生成一个三维坐标,并插入vtkPoints中for(unsigned int x = 0; x < GridSize; x++){for(unsigned int y = 0; y < GridSize; y++){xx = x + vtkMath::Random(-.2, .2);yy = y + vtkMath::Random(-.2, .2);zz = vtkMath::Random(-.5, .5);points->InsertNextPoint(xx, yy, zz);}}// Add the grid points to a polydata objectvtkSmartPointer<vtkPolyData> inputPolyData = vtkSmartPointer<vtkPolyData>::New();inputPolyData->SetPoints(points);// Triangulate the grid points//三角化之后,每个面片都是一个三角形,由三个点确定   //一个三角形vtkSmartPointer<vtkDelaunay2D> delaunay = vtkSmartPointer<vtkDelaunay2D>::New();//根据vtk的版本来选择数据输入方式
#if VTK_MAJOR_VERSION <= 5delaunay->SetInput(inputPolyData);
#elsedelaunay->SetInputData(inputPolyData);
#endifdelaunay->Update();vtkPolyData* outputPolyData = delaunay->GetOutput();//这个数组里面存放了六个坐标范围极值//分别是x轴方向最小最大坐标值//y轴方向最小最大坐标值//Z轴方向最小最大坐标值double bounds[6];outputPolyData->GetBounds(bounds);// Find min and max z//数组最后两个值存放的是Z轴方向最小最大坐标值double minz = bounds[4];double maxz = bounds[5];std::cout << "minz: " << minz << std::endl;std::cout << "maxz: " << maxz << std::endl;// Create the color mapvtkSmartPointer<vtkLookupTable> colorLookupTable = vtkSmartPointer<vtkLookupTable>::New();//这里如果不设置大小范围的话,默认的范围是0-1//这里根据自己的代码需要灵活设置颜色映射的范围值colorLookupTable->SetTableRange(minz, maxz);colorLookupTable->Build();// Generate the colors for each point based on the color mapvtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();colors->SetNumberOfComponents(3);colors->SetName("Colors");std::cout << "There are " << outputPolyData->GetNumberOfPoints()<< " points." << std::endl;for(int i = 0; i < outputPolyData->GetNumberOfPoints(); i++){double p[3];outputPolyData->GetPoint(i,p);double dcolor[3];//根据z轴的坐标值的数据来获得一个颜色标量值//(使用lookupTable颜色查找表来查找)//查找到的标量值放入dcolor中colorLookupTable->GetColor(p[2], dcolor);std::cout << "dcolor: "<< dcolor[0] << " "<< dcolor[1] << " "<< dcolor[2] << std::endl;unsigned char color[3];//把获取到的颜色标量转换为颜色值,并存入颜色标量colors中for(unsigned int j = 0; j < 3; j++){color[j] = static_cast<unsigned char>(255.0 * dcolor[j]);}std::cout << "color: "<< (int)color[0] << " "<< (int)color[1] << " "<< (int)color[2] << std::endl;colors->InsertNextTupleValue(color);}//给每一个点设置一个颜色,这个颜色是根据z轴的大小来设置的outputPolyData->GetPointData()->SetScalars(colors);// Create a mapper and actorvtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
#if VTK_MAJOR_VERSION <= 5mapper->SetInputConnection(outputPolyData->GetProducerPort());
#elsemapper->SetInputData(outputPolyData);
#endifvtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);// Create a renderer, render window, and interactorvtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();renderWindowInteractor->SetRenderWindow(renderWindow);// Add the actor to the scenerenderer->AddActor(actor);renderer->SetBackground(.1, .2, .3);// Render and interactrenderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;
}

这个立方体其他部分的颜色,也是通过标量值映射来的,不过这些标量值并不是手动设置,而是根据邻近的顶点的标量值,运用某种内插算法计算出来的。效果图如下:


                                                             图一


                                                             图二


                                                             图三


                                                             图四

图一图二图三是展示的不同角度的效果图。
图四是根据SetTableRange()的映射范围映射,根据z轴坐标值在lookupTable颜色查找表里查找对应的标量值,在将之转换成颜色值,给每个点一个颜色值,同时附近的区域也是通过标量值映射来的,是根据邻近定点的标量值,运用内插算法自动计算出来的。

VTK图像处理颜色映射(一)相关推荐

  1. VTK 曲面构建+颜色映射

    Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化. VTK编程中主要用到的几个对象 vtkRenderer ,vtkRende ...

  2. VTK:图像映射到颜色用法实战

    VTK:图像映射到颜色用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkImageActor.h> #include <vtkImageData ...

  3. Open3d学习计划—高级篇 7(颜色映射)

    Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...

  4. 5.6 图像颜色映射

    5.6 图像颜色映射 5.6.1 图像灰度映射 vtkImageLuminance负责将一个RGB彩色图像转换为一个单组分的灰度图像.映射公式如下: luminance = 0.3*R + 0.59* ...

  5. 5.3.4 图像颜色映射 (二)

    注:此文知识学习笔记,仅记录完整程序和实现结果,具体原理参见: https://blog.csdn.net/www_doling_net/article/details/8541534 https:/ ...

  6. python colormap(颜色映射)自定义

    在前面讲过颜色映射了,见:https://blog.csdn.net/mr_cat123/article/details/80709099 和https://blog.csdn.net/mr_cat1 ...

  7. python colormap(颜色映射)

    转载(有增减,后面有举例):http://blog.csdn.net/guduruyu/article/details/60868501 [python] view plain copy import ...

  8. matlab0-255的颜色映射到0-1,python中的matlab颜色映射

    我想(?)您需要的是一个Colour Mapping函数,如:def create_colourmap(colour, grey): c_map = numpy.zeros((256,4), dtyp ...

  9. python opencv cv.applyColorMap()函数(颜色映射)ColormapTypes【将Intel Realsense D435深度图的黑白图映射为彩色图】

    文章目录 API ColormapTypes 完整应用代码[将深度图的黑白图映射为彩色图] map原理 能否map CV_24UC3的? API def applyColorMap(src, colo ...

最新文章

  1. Redis系列-远程连接redis并给redis加锁
  2. 所有编程皆为Web编程
  3. 模板建站和开发网站区别_湖南网站建设定制网站和模板建站的区别
  4. Spring远程调用技术1-RMI
  5. java什么是网络接口_java 网络编程 -- IP地址的表示与网络接口信息的获取(InetAddress和NetworkInterface)...
  6. Python 上传文件到阿里云OSS
  7. linux vi打开后向上查找文本,linux之文本编辑器vi常用命令
  8. Mirth Linux(Centos)无界面安装及配置,可作为服务总线用,功能超强,就不细说了
  9. 可视化工具netron的使用
  10. javase核心day13
  11. 【江枫】lvm2与powerpath的Found duplicate PV问题
  12. 团队作业——团队项目Alpha版本发布
  13. AR互动大屏项目实战
  14. ROS2+nav2+激光雷达导航(上)
  15. 关于大脑记忆可视化的初步尝试(一)
  16. Android中使用apk-parser解析apk
  17. python_path
  18. scala中的break和continue
  19. RewriteCond %{REQUEST_URI}
  20. 计算机专业学生u盘32g够用吗,很超值:为什么我的32G USB只有28.8g?

热门文章

  1. Java操作系统进程调度算法——优先级调度(HPF)算法
  2. string resource id #0x0的问题
  3. RT-Thread 隐藏的宝藏之双链表
  4. 【transformer】【pytorch】DeiT的数据增强
  5. 网络安全漏洞深度剖析
  6. 朋友圈已经被《后浪》刷屏?用Python看一下微博和知乎别人的看法
  7. Java 中 a = a+b和a +=b 的区别
  8. 瑞昱Realtek显示类芯片-简介V2.0
  9. Android 获取屏幕宽高的正确姿势
  10. 关于“十进制转二进制,求位数”的一点小结