注:此文知识学习笔记,仅记录完整程序和实现结果,具体原理参见:

https://blog.csdn.net/www_doling_net/article/details/8541534

https://blog.csdn.net/shenziheng1/article/category/6114053/4

3、灰度图像映射成伪彩色图像(查表法 vtkLookUpTable)

图像彩色映射的原理是首先生成一个颜色查找表,然后根据图像的一个标量值向颜色查找表中查找对应的颜色,并用新颜色值替代原来的像素值。VTK中vtkImageMapToColors负责图像彩色映射,vtkLookUpTable负责生成颜色查找表。

#include <vtkSmartPointer.h>
#include <vtkJPEGReader.h>
#include <vtkLookupTable.h>       //生成颜色查找表
#include <vtkImageMapToColors.h>  //实现图像彩色映射
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
int main()
{vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();reader->SetFileName("data\\lena-gray.jpg");//建立颜色映射查找表  vtkSmartPointer<vtkLookupTable> colorTable = vtkSmartPointer<vtkLookupTable>::New();colorTable->SetRange(0.0, 255.0);colorTable->SetHueRange(0.1, 0.5); //色调(H)范围colorTable->SetValueRange(0.6, 1.0);  //明度(V)范围colorTable->Build();   //生成颜色查找表//建立颜色映射  vtkSmartPointer<vtkImageMapToColors> colorMap =  vtkSmartPointer<vtkImageMapToColors>::New();colorMap->SetInputConnection(reader->GetOutputPort());colorMap->SetLookupTable(colorTable);  //用来设置相应的颜色查找表colorMap->Update();//建立演员  vtkSmartPointer<vtkImageActor> origActor = vtkSmartPointer<vtkImageActor>::New();origActor->SetInputData(reader->GetOutput());vtkSmartPointer<vtkImageActor> colorActor = vtkSmartPointer<vtkImageActor>::New();colorActor->SetInputData(colorMap->GetOutput());//化妆  double origView[4] = { 0.0, 0.0, 0.5, 1.0 };double colorView[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> origRender = vtkSmartPointer<vtkRenderer>::New();origRender->SetViewport(origView);origRender->AddActor(origActor);origRender->ResetCamera();origRender->SetBackground(0.0, 0.0, 0.0);vtkSmartPointer<vtkRenderer> colorRender = vtkSmartPointer<vtkRenderer>::New();colorRender->SetViewport(colorView);colorRender->AddActor(colorActor);colorRender->ResetCamera();colorRender->SetBackground(0.0, 0.0, 0.0);//舞台  vtkSmartPointer<vtkRenderWindow> renderwindow =  vtkSmartPointer<vtkRenderWindow>::New();renderwindow->AddRenderer(origRender);renderwindow->AddRenderer(colorRender);renderwindow->SetSize(640, 320);renderwindow->SetWindowName("GrayToColor");//设置交互  vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(renderwindow);rwi->Initialize();rwi->Start();return 0;
}

首先读取了一个灰度图像,然后生成vtkLookUpTable颜色查找表。构造颜色查找表有两种方法,一种是直接添加颜色,另一种是设置HSV颜色空间变化范围(hue, saturation, value),然后自动生成颜色表。这里采用的是第二种方法,SetRange 设置要映射的标量数据的范围;SetHueRange设置HSV颜色空间的Hue值范围,最大范围为[0,1]; SetValueRange设置HSV颜色空间的Value范围,最大范围为[0, 1];设置完后,调用Build()来生成颜色查找表。接下来定义vtkImageMapToColors对象, SetLookupTable()设置相应的颜色查找表,执行Update()后,其输出为一副彩色图像。执行结果如下:

4、颜色合成(三张灰度图合成彩色图)

#include <vtkSmartPointer.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkImageAppendComponents.h>  //vtk中提供vtkImageAppendComponents类来合成彩色图像,其输入需要提供三个灰度图像
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>  int main()
{//vtkImageCanvasSource2D定义三个二值图像,每个图像中绘制了一个白色区域vtkSmartPointer<vtkImageCanvasSource2D> red = vtkSmartPointer<vtkImageCanvasSource2D>::New(); //红色画布red->SetScalarTypeToUnsignedChar();  //数据类型转换red->SetNumberOfScalarComponents(1);red->SetExtent(0, 100, 0, 100, 0, 0);red->SetDrawColor(0, 0, 0, 0);red->FillBox(0, 100, 0, 100);red->SetDrawColor(255, 0, 0, 0);red->FillBox(20, 40, 20, 40);red->Update();vtkSmartPointer<vtkImageCanvasSource2D> green = vtkSmartPointer<vtkImageCanvasSource2D>::New();green->SetScalarTypeToUnsignedChar();green->SetNumberOfScalarComponents(1);green->SetExtent(0, 100, 0, 100, 0, 0);green->SetDrawColor(0, 0, 0, 0);green->FillBox(0, 100, 0, 100);green->SetDrawColor(255, 0, 0, 0);green->FillBox(30, 50, 30, 50);green->Update();vtkSmartPointer<vtkImageCanvasSource2D> blue = vtkSmartPointer<vtkImageCanvasSource2D>::New();blue->SetScalarTypeToUnsignedChar();blue->SetNumberOfScalarComponents(1);blue->SetExtent(0, 100, 0, 100, 0, 0);blue->SetDrawColor(0, 0, 0, 0);blue->FillBox(0, 100, 0, 100);blue->SetDrawColor(255, 0, 0, 0);blue->FillBox(40, 60, 40, 60);blue->Update();//vtkImageAppendComponents对象的输入来合成图像vtkSmartPointer<vtkImageAppendComponents> appendFilter = vtkSmartPointer<vtkImageAppendComponents>::New();appendFilter->SetInputConnection(0, red->GetOutputPort());appendFilter->AddInputConnection(0, green->GetOutputPort());appendFilter->AddInputConnection(0, blue->GetOutputPort());appendFilter->Update();vtkSmartPointer<vtkImageActor> redActor = vtkSmartPointer<vtkImageActor>::New();redActor->SetInputData(red->GetOutput());vtkSmartPointer<vtkImageActor> greenActor = vtkSmartPointer<vtkImageActor>::New();greenActor->SetInputData(green->GetOutput());vtkSmartPointer<vtkImageActor> blueActor = vtkSmartPointer<vtkImageActor>::New();blueActor->SetInputData(blue->GetOutput());vtkSmartPointer<vtkImageActor> combinedActor = vtkSmartPointer<vtkImageActor>::New();combinedActor->SetInputData(appendFilter->GetOutput());   //合成对象结果作为组合演员展示在显示窗口// Define viewport ranges  // (xmin, ymin, xmax, ymax)  double redViewport[4] = { 0.0, 0.0, 0.25, 1.0 }; // 定义可视区域double greenViewport[4] = { 0.25, 0.0, 0.5, 1.0 };double blueViewport[4] = { 0.5, 0.0, 0.75, 1.0 };double combinedViewport[4] = { 0.75, 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);vtkSmartPointer<vtkRenderer> greenRenderer = vtkSmartPointer<vtkRenderer>::New();greenRenderer->SetViewport(greenViewport);greenRenderer->AddActor(greenActor);greenRenderer->ResetCamera();greenRenderer->SetBackground(1.0, 1.0, 1.0);vtkSmartPointer<vtkRenderer> blueRenderer =    vtkSmartPointer<vtkRenderer>::New();blueRenderer->SetViewport(blueViewport);blueRenderer->AddActor(blueActor);blueRenderer->ResetCamera();blueRenderer->SetBackground(1.0, 1.0, 1.0);vtkSmartPointer<vtkRenderer> combinedRenderer =   vtkSmartPointer<vtkRenderer>::New();combinedRenderer->SetViewport(combinedViewport);combinedRenderer->AddActor(combinedActor);combinedRenderer->ResetCamera();combinedRenderer->SetBackground(1.0, 1.0, 1.0);vtkSmartPointer<vtkRenderWindow> renderWindow =   vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(redRenderer);renderWindow->AddRenderer(greenRenderer);renderWindow->AddRenderer(blueRenderer);renderWindow->AddRenderer(combinedRenderer);renderWindow->SetSize(1200, 300);renderWindow->Render();renderWindow->SetWindowName("ImageAppendComponentsExample");vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();renderWindowInteractor->SetInteractorStyle(style);renderWindowInteractor->SetRenderWindow(renderWindow);renderWindowInteractor->Initialize();renderWindowInteractor->Start();return 0;
}

上面代码中利用vtkImageCanvasSource2D定义了3个二值图像,每个图像中绘制了一个白色矩形,并且三个矩形有部分重叠,然后定义vtkImageAppendComponents对象,并将三个图像设置为vtkImageAppendComponents对象的输入来合成图像。合成的效果为三个图像中对应的三个像素点像素值合成为输出图像的RGB像素值,如三个图像中第100个像素的像素值分别为,255,0和0,那么该点在输出图像中的像素值为(255, 0, 0),显示为红色。本例的执行效果如下:

参考资料:

1.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
2. 张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

所用软件:vtk7.0+visual studio 2013

5.3.4 图像颜色映射 (二)相关推荐

  1. 5.6 图像颜色映射

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

  2. SRPG游戏开发(十)第五章 颜色映射与职业动画 - 二 颜色组(Color Chart)

    返回目录 第五章 颜色映射与职业动画 二       颜色组(Color Chart) 颜色组是保存许多颜色的一个容器,可以在Swapper中直接创建List<Color>或Color[] ...

  3. python 数据可视化 matplotlib学习二 : 对折线图使用颜色映射

    本节代码依赖上一节代码 颜色映射是一系列颜色,他们从起始颜色渐变到结束颜色,在可视化中,颜色映射用于突出数据的规律,例如,你可能用较浅的颜色来显示较小的值,并使用较深的颜色来显示较大的值 下面演示如何 ...

  4. 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图

    [Python]函数图像绘制:二维图像.三维图像.散点图.心形图 所有需要用的包 二维图像 三维图像 散点图绘制 心形图绘制 所有需要用的包 from mpl_toolkits.mplot3d imp ...

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

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

  6. 图形图像处理-之-高质量的快速的图像缩放 中篇 二次线性插值和三次卷积插值

    from:http://blog.csdn.net/housisong/article/details/1452249 图形图像处理-之-高质量的快速的图像缩放 中篇 二次线性插值和三次卷积插值    ...

  7. 计算机视觉编程——图像到图像的映射

    文章目录 图像到图像的映射 1 单应性变换 1.1 直接线性变换算法 1.2 仿射变换 2 图像扭曲 2.1 图像中的图像 2.2 分段仿射扭曲 2.3 图像配准 3 创建全景图 3.1 RANSAC ...

  8. python计算机视觉学习第三章——图像到图像的映射

    目录 引言 一. 单应性变换 1.1 直接线性变换算法 1.2 仿射变换 二. 图像扭曲 2.1 图像中的图像 2.2 分段仿射扭曲 2.2 图像配准 三.创建全景图 3.1 RANSAC(随机一致性 ...

  9. 图像颜色迁移专题介绍(三): Deep Examplar-based Colorization

    在之前的两篇博客中,我们已经介绍了关于color transfer在2015年之前的一些主流的研究思路,即在相应的颜色空间中,利用语义对应关系,实现语义一致的颜色迁移.博客链接: 图像颜色迁移专题介绍 ...

最新文章

  1. 天啦噜!生产机器连接数飙升到上万,背后发生了什么?
  2. ASP.NET之父强烈推荐,无可争议的圣经级巨著
  3. ThinkPHP(3)SQL查询语句
  4. COMMCONFIG进行配置的WIN32 API
  5. [HNOI2013]数列(差分)
  6. python,时间加减,时间计算,时间格式化,时间提取汇总
  7. iOS开发中的单元测试(三)——URLManager中的测试用例解析
  8. Linux基础操作及命令管理
  9. Ubuntu16.04 安装Maven 3.5.3
  10. java 加密工具包_加密工具类 - CryptoUtils.java
  11. OMRON继电器基础讲解
  12. 计算机术语中英文对照
  13. 信号完整性分析系列2——什么是信号完整性及何时遇到
  14. ubuntu 14.04 使用极点五笔输入法
  15. 史上最全的MySQL优化手册
  16. 网络工程师的敲门砖,2022最新HCIA-Datacom题库H12-811首发分享
  17. 增值税发票二维码内容字段解析
  18. 数学建模之美赛小总结
  19. Android 反编译初探-基础篇
  20. Persist Security Info 是什么意思

热门文章

  1. AS中码云的使用入门
  2. #第五章“拷问”既往的股市理论5.1有人情味的“拷问”
  3. 上网看视频国家版八段锦,很好的预防和治疗久坐办公室带来的肩周颈椎疾病...
  4. 读入数据+使用snownlp进行情感分析
  5. 一个神奇的下载按钮css实现
  6. 无锁队列的实现 | 酷壳 - CoolShell.cn
  7. 看完这篇,请不要再说不懂MOSFET!
  8. Mysql主从复制手动切换步骤
  9. 数据结构课程设计--农夫过河
  10. 计算机毕设(附源码)JAVA-SSM金牛社区疫情防控系统