VTK图像处理之访问图像像素值

05-VTK在图像处理中的应用(2) 5.4 vtkImageData基本操作 图像处理离不开一些基本的图像数据操作,例如获取和修改图像的基本信息,访问和修改图像像素值,图像显示,图像类型转换等等。熟练掌握这些基本操作有助于使用VTK进行图像处理的快速开发。   5.4.1图像信息访问和修改 vtkImageData中提供了多个函数用于访问或者获取图像的基本信息,这些函数通常使用Set或者Get加上相应的信息名的形式,例如获取 阅读详情
图像像素值的访问与修改是最常用的一种操作。VTK提供了两种访问图像像素值的访问。

一、直接访问

  第一种方法是直接发访问vtkImageData的数据数组。vtkImageData提供了GetScalarPointer()函数获取数据数组指针,该函数有三种形式:

virtual void* GetScalarPointer(int coordinates[3]);
virtual void* GetScalarPointer(int x, int y, int z);
virtual void* GetScalarPointer();

前两种形式根据给定的像素索引得到指定的像素值,注意返回的是第(x,y,z)个像素值的地址。而第三种形式是返回图像数据数组的头指针,然后根据头指针可以依次访问索引像素。

示例演示

使用GetScalarPointer遍历图像像素。

CMakeLists.txt代码

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

VisitImagePixelDirectlyExample.cpp文件代码如下:

/**********************************************************************

文件名: VisitImagePixelDirectlyExample.cpp
Copyright (c) 阿Bin先生. All rights reserved.
更多信息请访问: http://blog.youkuaiyun.com/webzhuce

**********************************************************************/

#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkBMPReader.h>
#include <vtkImageData.h>

int main(int argc, char* argv[])
{
    vtkSmartPointer<vtkBMPReader> reader =
        vtkSmartPointer<vtkBMPReader>::New();
    //测试图像:E:\TestData\masonry.bmp
    reader->SetFileName("E:\\TestData\\masonry.bmp");
    reader->Update();

    int dims[3];
    reader->GetOutput()->GetDimensions(dims);

    int nbOfComp;
    nbOfComp = reader->GetOutput()->GetNumberOfScalarComponents();

    for(int k=0; k<dims[2]; k++)
    {
        for(int j=0; j<dims[1]; j++)
        {
            for(int i=0; i<dims[0]; i++)
            {
                if(i<100 && j<100)
                {
                    unsigned char * pixel = 
                        (unsigned char *) ( reader->GetOutput()->GetScalarPointer(i, j, k) );
                    *pixel = 0;
                    *(pixel+1) = 0;
                    *(pixel+2) = 0;
                }
            }
        }
    }

    vtkSmartPointer<vtkImageViewer2> imageViewer =
        vtkSmartPointer<vtkImageViewer2>::New();
    imageViewer->SetInputConnection(reader->GetOutputPort());

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    imageViewer->SetupInteractor(renderWindowInteractor);
    imageViewer->Render();
    imageViewer->GetRenderer()->ResetCamera();
    imageViewer->Render();

    imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
    imageViewer->SetSize(640, 480);
    imageViewer->GetRenderWindow()->SetWindowName("VisitImagePixelDirectlyExample");


    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

运行结果:

这里写图片描述

  示例实现了将图像的100*100大小的区域设置为黑色。通过GetScalarPointer(i,j,k)函数获取访问图像像素值。需要注意的是,GetScalarPointer()函数返回的是void*类型,因此需要根据图像的实际类型进行强制转换。示例中将像素数组的头指针类型转换为unsigned char*。
  此外,需要注意的地方:VTK彩色以及矢量图像采用的是如下图所示的像素存储格式:
  
这里写图片描述

  因此在修改RGB图像以及矢量图像像素时,需要根据像素的元组的组分数目来访问。示例中先获得第(i,j,k)个像素的地址也就是R值的地址,然后将地址加1来访问后续G值和B值。如果对像素的元组组分不确定,可以通过函数GetNumberOfScalarComponent()获取,代码如下:

int nbOfComp = reader->GetOutput->GetNumberOfScalarComponent()

二、迭代器访问

  第二种方法是用vtkImageIterator类实现迭代器方法访问图像像素。该类是一个模板类,使用时,需要提供迭代的图像像素类型以及迭代的区域大小。

示例演示

CMakeLists.txt代码

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

VisitImagePixelIterativelyExample.cpp文件代码如下:

/**********************************************************************

文件名: VisitImagePixelIterativelyExample.cpp
Copyright (c) 阿Bin先生. All rights reserved.
更多信息请访问: http://blog.youkuaiyun.com/webzhuce

**********************************************************************/

#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkBMPReader.h>
#include <vtkImageData.h>
#include <vtkImageIterator.h>


int main(int argc, char* argv[])
{
    vtkSmartPointer<vtkBMPReader> reader =
        vtkSmartPointer<vtkBMPReader>::New();
    //测试图像:E:\\TestData\\masonry.bmp
    reader->SetFileName ( "E:\\TestData\\masonry.bmp" );
    reader->Update();

    int subRegion[6] = {0,100, 0, 100, 0, 0};
    vtkImageIterator<unsigned char> it(reader->GetOutput(), subRegion);

    while(!it.IsAtEnd())
    {
        unsigned char *inSI = it.BeginSpan();
        unsigned char *inSIEnd = it.EndSpan();

        while(inSI != inSIEnd)
        {
            *inSI = 255-*inSI;
            ++inSI;
        }
        it.NextSpan();
    }

    vtkSmartPointer<vtkImageViewer2> imageViewer =
        vtkSmartPointer<vtkImageViewer2>::New();
    imageViewer->SetInputConnection(reader->GetOutputPort());

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    imageViewer->SetupInteractor(renderWindowInteractor);
    imageViewer->Render();
    imageViewer->GetRenderer()->ResetCamera();
    imageViewer->Render();

    imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
    imageViewer->SetSize(640, 480);
    imageViewer->GetRenderWindow()->SetWindowName("VisitImagePixelIterativelyExample");

    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

运行结果:

这里写图片描述

   示例读取了一幅BMP图像,然后定义一个子区域。注意:在定义子区域时,不要超过图像的大小范围。然后根据图像类型unsigned char定义一个图像迭代器it,定义it时有两个参数:一个是要访问的图像,另一个是访问的图像区域。设置完毕,迭代器开始工作第一个while循环是判断迭代器是否结束。进入循环后,对于每一个迭代器it,又存在第二个循环,判断的是当前像素的元组(Tuple)是否迭代完毕。由于VTK中所有类型的图像格式都是vtkImageData,因此每个像素可能是标量,也可能是矢量。因此,每当访问到一个像素时需要迭代当前像素的元组。元组迭代时,inSI = it.BeginSpan()获取第一个组分,inEnd = it.EndSpan()表示组分迭代完毕。

基于C++的水灵VTK8学习笔记2(VTK图像处理) 第五章 VTK图像处理 实例16:用vtkImageCanvasSource2D创建图像 #include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkImageData.h> #include <vtkImageCanvasSource2D. 阅读详情

相关推荐

Paraview图像处理-ParaviewWeb获取渲染图像过程

借助于VTK,Paraview提供了强大的图像处理功能。在VTK中,使用vtkImageData来表示图像的数据结构,它保存了图像的像素、维度、像素间隔等信息,不仅可以表示像素,还可以表示体素。另外,它还可以表示几何体以及拓扑关系(vtkImageData represents a geometric structure that is a topological and geometrical

6827

学习笔记2

Vtk: 05-VTK在图像处理中的应用(1) 数字图像文件内容由两个部分组成:图像头信息和数据 图像数据即为图像像素的像素值(灰度值) 在VTK中图像数据结构由vtkImageData类表示。利用vtkImageData,我们可以方便的创建、读写、和访问图像数据 VTK中内置了多个创建图像的Source,利用这些Source可以快速的创建图像,其中以vtkImageCanvasSource2D为代表。该Source功能是创建一个画布(空白图像),并提供了多种几何图形(点、线段、圆、矩形以及图像等)的

qq_41904390的博客 342

VTK:图像遍历器应用实例

在VTK中,图像遍历器是一种强大的工具,用于遍历多维数组或图像的像素。本文将介绍如何使用VTK图像遍历器进行图像遍历和像素操作。除了以上示例,VTK图像遍历器还支持更多的操作,比如遍历某个子区域、在遍历过程中跳过某些像素等。使用图像遍历器能够大量减少遍历图像所需的代码量,并且提高代码的可读性和效率。首先,我们需要准备一张图像。创建好遍历器后,我们就可以使用它遍历图像,并操作像素数据了。本文仅介绍了VTK图像遍历器的基础用法,读者可以根据实际需求进行更复杂的操作。VTK:图像遍历器应用实例。

2301_79366106的博客 189

VTK GetScalarPointer() and GetScalarComponentAsFloat() not work

  I am using VTK 5.10.1 with VS 2010, and the following example does not work on my machine: http://www.vtk.org/Wiki/VTK/Examples/Cxx/ImageData/IterateImageData The erros said: vtkImageData [009B9...

weixin_33851429的博客 450

VTK:图像迭代器的使用方法(C/C++)

在这个示例中,我们使用GoToBegin()方法将迭代器移动到图像的起始位置,并使用IsAtEnd()方法检查迭代器是否到达图像的末尾。然后,我们使用vtkImageIterator类创建了一个图像迭代器对象it,并将图像数据和图像范围传递给构造函数。除了使用图像迭代器遍历图像外,我们还可以使用GetScalarPointer()方法获取指定位置的像素指针,并使用static_cast将其转换为合适的数据类型。通过本文的介绍,我们了解了如何使用VTK的图像迭代器来遍历和操作图像数据。

PixelBlade的博客 202

VTK编程指南<十三>:VTK图像信息与图像像素值处理

VTK编程指南<十三>:VTK图像信息与图像像素值处理

欧特GO 1447

VTK知识学习(26)- 图像基本操作(一)

图像处理离不开一些基本的图像数据操作,例如获取和修改图像的基本信息、访问和修改图像像素值、图像显示、图像类型转换等。熟练掌握这些基本操作有助于使用 VTK进行图像处理应用程序的快速开发。

weixin_45114627的博客 1214

机械臂控制的基础知识

在现代工业中,机械臂的自动化控制已经成为智能制造的重要一环。控制机械臂涉及多个学科,包括机械设计、运动学、控制理论和编程等。本文将从以下几个方面介绍机械臂控制的核心知识点:机械臂的构成、运动学分析、动力学建模、控制方法及编程实现。

qq_45728381的博客 5470

VTK在图像处理中的应用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34268310的博客 238

AI编程实战:用Spec Coding与Codex半小时重构全栈项目

这次我们来看一个能显著提升全栈开发效率的实战方法:利用 AI 编程工具 Codex 和 Spec Coding 工作流,将原本需要数周甚至一个月的全栈项目重构工期,压缩到半小时级别。这不是概念探讨,而是基于现有工具链的、可立即上手的工程实践。 对于前端开发者或全栈工程师而言,面对老旧项目重构、技术栈升级或从零搭建新项目时,最大的痛点往往是重复性、模式化的代码编写工作。手动编写 CRUD 接口、页面组件、状态管理和联调测试,耗时费力且容易出错。而 AI 辅助编程的核心价值,正是在于将开发者从这些“体力活”中解

weixin_33525298的博客 290

Zabbix华为交换机光衰告警

zabbix使用自动发现监控huawei网络设备光衰

qq_31651649的博客 4529

VTK图形图像开发进阶-学习笔记 05(02) VTK图像处理

5.3 VTK图像基本操作 5.3.1 图像信息的访问与修改 5.3.2 图像像素值的访问与修改 5.3.3 图像类型转换 5.3.4 图像颜色映射 1 图像灰度映射 2 提取颜色组分 3 图像彩色映射 4 颜色合成 5.3.5 区域提取 1 提取感兴趣区域 2 三维图像截面提取 3 扩展-滑动鼠标切换三维图像切面 5.3.6 直方图统计 1 灰度图像直方图 2 彩色图像直方图 5.3.7 图像重采样 5.3.8 图像运算 1 数学运算 2 逻辑运算 5.3.9 图像

wangxingxing321的博客 850

基于STM32的多模态智能风扇控制系统设计与实现

本文详细介绍了基于STM32单片机的多模态智能风扇控制系统的设计与实现。系统集成了红外遥控、蓝牙手机控制及人体感应等多模态交互方式,通过PWM技术实现无级调速,并设计了安全优先的控制逻辑。文章从硬件选型、核心原理、软件编程到系统调试,提供了完整的实战指南,适合嵌入式开发爱好者学习与实践。

weixin_28285943的博客 238

VTK随笔七:VTK图像处理(图像基本操作)

VTK随笔七:VTK图像处理(图像基本操作)。图像信息的访问与修改、图像像素值的访问与修改、图像类型转换、图像颜色映射、区域提取、直方图统计、图像重采样、图像运算、图像二值化

u012959478的博客 1404

超声波清洗机拆解实录:从电路板到换能器,一文看懂内部构造(附高清图)

本文详细拆解了超声波清洗机的内部构造,从电路板设计到换能器工作原理,揭示了其核心技术。通过高清图片和详细分析,展示了功率放大电路、高频变压器及压电换能器等关键部件,为电子爱好者和维修技术人员提供了实用的故障诊断和元件二次利用指南。

grape的博客 1183

PVE启动卡在loading initial ramdisk

pve显卡直通导致的异常解决

学而时习之 6690

VTK图形图像学习笔记05

VTK图像处理 参考书:张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015. 1.1 VTK图像创建 1.1.1 VTK图像数据结构 数字图像文件内容包括两部分:图像头信息和数据。 图像头信息定义了图像基本信息,主要包括起点位置(Origin)、像素间隔(Space)和维数(Dimension)。通过这三个参数可确定图像空间位置和大小。 图像可以看做是空间中的一个规则的网格,网格中每一个最小单元称为像素(二维)或者体素(三维),网格在每个方向上的像素或者体素的个数即为图像在该方向

weixin_42685374的博客 674

Python爬虫实战:高效爬取中国专利数据库的完整指南

在当今信息爆炸的时代,专利数据作为技术创新的重要指标,对企业研发、市场分析和学术研究都具有极高价值。中国作为全球专利申请量最大的国家,其专利数据库包含了海量的技术创新信息。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的中国专利数据库爬虫系统。中国专利数据库主要由国家知识产权局(CNIPA)维护,包含发明专利、实用新型专利和外观设计专利三大类。截至2023年,中国专利数据库已收录超过400万件发明专利和300万件实用新型专利。

2201_76125261的博客 1572

VTK学习笔记(七)vtkImageData基本操作

VTK学习笔记(七)vtkImageData基本操作1、vtkImageData基本操作1.1、图像信息访问和修改 1、vtkImageData基本操作 图像数据在VTK 中是用vtkImageData 类表示的,对于不同的图像文件类型,VTK 提供相对应的类对图像文件进行读写操作。比如,前面章节中所提的vtkBMPReader 是用于读取BMP 图像,vtkJPEGReader 用于读取JPG 图像。VTK 除了支持BMP、JPG 图像格式之外,还支持其他多种图像格式的读写。 图像处理离不开一些基本的图

juluwangriyue的博客 3893

华为OD机试真题 新系统 - 勇攀数字高峰 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2095

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

7.VTK图像基本操作

这个专栏是用于记录我在学习VTK过程中的一些心得体会。参考的资料主要有以下三个:1. 张晓东 罗火灵《VTK图形图像开发进阶》3. 沈子恒 《VTK 三维数据渲染进阶》遇到的一个大问题就是由于版本更新,这些资料中很多代码无法正常运行,需要进行一定的修改,所以这个专栏会记录下来我修改后的程序代码,以便于我之后温习。也希望能给和我有同样困扰的小伙伴们一些帮助。我使用的版本:VTK9 + VS2022。

weixin_52194015的博客 385

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【QT+VTK 学习笔记】07:图像信息的访问与修改、图像类型转换、图像颜色映射

前言 “VTK图形图像开发进阶_张晓东_罗火灵”的学习笔记。 东灵工作室 教程系列导航:http://blog.youkuaiyun.com/www_doling_net/article/details/8763686 学习资料 VTK官网学习地址:https://vtk.org/doc/nightly/html/ 学习笔记 VTK图像基本操作 熟练掌握这些基本操作有助于使用VTK进行图 像处理应用程序的快速开发。 图像信息的访问与修改 利用vtklmageData的方法 获取图像维数、图像原点、像素间隔。 vtkS

qq_37373742的博客 908

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

vtkImageData基本操作

5.4 vtkImageData基本操作图像处理离不开一些基本的图像数据操作,例如获取和修改图像的基本信息,访问和修改图像像素值,图像显示,图像类型转换等等。熟练掌握这些基本操作有助于使用VTK进行图像处理的快速开发。5.4.1图像信息访问和修改vtkImageData中提供了多个函数用于访问或者获取图像的基本信息,这些函数通常使用Set或者Get加上相应的信息名的形式,例如获取图像维数的方法定义为

yu132563的专栏 2355

VTK-抄书笔记(5)上

数字图像是一种重要的多媒体数据,广泛应用于工业生产、生物医学、地质、气象等重要领域。数字图像处理技术具有重要的应用价值。图像是VTK里非常重要的一种数据结构。本章重点讲解VTK在数字图像处理应用方面的相关技术。

qq_51627050的博客 750

05-VTK在图像处理中的应用(1)

5、VTK在图像处理中的应用 图像是VTK中一个非常重要的数据。数字图像广泛应用于工业生产、生物医学、媒体娱乐、地质、气象等重要领域,数字图像处理具有重要的应用价值。我们在掌握了VTK的基本知识后,这一章着重讲解数字图像处理相关技术,学完本章你会觉得原来图像处理是如此简单! 5.1 VTK图像数据结构 数字图像文件内容由两个部分组成:图像头信息和数据。图像头信息定义了图像的基本信息,主要包括

东灵工作室 2万+
上一篇: VTK之基于Qt的VTK应用程序
下一篇: VTK之引用计数详解
暮-成-雪
博客等级 码龄12年 5328粉丝 319原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值