ITK imagedata三维体数据与VTK imagedata三维体数据的互相转换

VTK的三维imagedata转化为ITK的三维imagedata,以及和ITK的三维imagedata转化为VTK的三维imagedata的代码:

#include <itkVTKImageToImageFilter.h>
#include <vtkImageData.h>
#include <itkImageToVTKImageFilter.h>
#include <itkImage.h>
#include <vtkSmartPointer.h>typedef int PixelType;
typedef itk::Image< PixelType, 3> ImageType;//imageVTK:传入的vtk体数据 vtkSmartPointer<vtkImageData> imageVTK = vtkSmartPointer<vtkImageData>::New();
bool VTKImageToITKImage(vtkImageData* imageVTK)
{typedef itk::VTKImageToImageFilter<ImageType> vtkToitkFilter;vtkToitkFilter::Pointer itkFilter = vtkToitkFilter::New();itkFilter->SetInput(imageVTK);itkFilter->UpdateLargestPossibleRegion();try{itkFilter->Update();}catch (itk::ExceptionObject){std::cerr<<"vtk to itk failed!"<<std::endl;return false;}return true;
}//itkImage: 传入的itk体数据 ImageType::Pointer itkImage = ImageType::New();
bool ITKImageToVTKImage(ImageType::Pointer itkImage)
{typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;ConnectorType::Pointer connector = ConnectorType::New();connector->SetInput(itkImage );try{connector->Update();}catch (itk::ExceptionObject){std::cerr<<"itk to vtk failed!"<<std::endl;return false;}vtkSmartPointer<vtkImageData> imageVTK = vtkSmartPointer<vtkImageData>::New();imageVTK->ShallowCopy(connector->GetOutput());return true;
}

ITK/VTK图像数据差别
 ITK与VTK的图像数据的坐标原点都在图像的左下角;

但是在读取图像时,二者的存储方式不同。以常用的dicom图像为例,图像的第一个像素定义为左上角。当使用VTK进行读取时,VTK将图像的第一个像素存储在左下角,因此,读取的图像是沿着Y轴反转的。而ITK则没有翻转的过程,其按照图像像素排列的原始顺序读入图像,然后将坐标原点移动到图像的左下角。二者图像数据读取方式的不同,导致二者之一的图像必须进行翻转,才能与另一个匹配。

ITK TO VTK ITK转化为VTK图像使用类
ITK/VTK数据转换的类均存放在ITKVTKGlue模块  itkImageToVTKImageFilter 中:

#include <itkImageToVTKImageFilter.h>
#include "itkVTKImageIOFactory.h"
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageRegionIterator.h"using PixelType = signed short;
constexpr unsigned int Dimension = 3;//初始化待读取序列的格式类型using ImageType = itk::Image<PixelType, Dimension>;using ReaderType = itk::ImageSeriesReader<ImageType>;using ImageIOType = itk::GDCMImageIO;using NamesGeneratorType = itk::GDCMSeriesFileNames;using ConnectorType = itk::ImageToVTKImageFilter<ImageType>;auto connector1 = ConnectorType::New();connector1->SetInput(reader->GetOutput());connector1->Update();

VTK TO ITK  VTK转化为ITK图像使用类itkVTKImagetoImageFilter:

#include <itkVTKImageToImageFilter.h>
#include "itkVTKImageIOFactory.h"
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageRegionIterator.h"using PixelType = signed short;
constexpr unsigned int Dimension = 3;//初始化待读取序列的格式类型using ImageType = itk::Image<PixelType, Dimension>;vtkNew<vtkImageData> mTmpImageData;typedef itk::VTKImageToImageFilter<ImageType> VTKImageToImageType;VTKImageToImageType::Pointer vtkImageToImageFilter1 = VTKImageToImageType::New();
vtkImageToImageFilter1->SetInput(mTmpImageData);//vtkImageToImageFilter->SetInput(reader->GetOutput());
vtkImageToImageFilter1->Update();

注意事项

ITK/VTK二者图像数据互相转换后,可能会出现图像数据的spacing, direction, origin, position的变化,为了保证二者图像的一致性,常常需要人为设置这些参数 :

/*
an itk::Image and converts it into a vtkVolume, keeping it in DICOM's
patient physical world space. Its main usage is combining it with segmented
structures (vtkPolyData) whose vertices are in DICOM patient space, that
is, vertex coordinates were obtained using
*/
visualizing->TransformIndexToPhysicalPoint().
typedef itk::Image < unsigned char, 3 > ImageType;
void showITKimageInVTKqwidget(ImageType::Pointer visualizing)
{typedef itk::ImageToVTKImageFilter<ImageType> itkVtkConverter;itkVtkConverter::Pointer conv=itkVtkConverter::New();conv->SetInput(visualizing);vtkGPUVolumeRayCastMapper *mapper = vtkGPUVolumeRayCastMapper::New();mapper->SetInput(conv->GetOutput());vtkVolume *volume=vtkVolume::New();volume->SetProperty( myTransferFunction );volume->SetMapper( mapper );// vtkVolume only manages spacing by itself.// Here we take care of position and orientation so it is in DICOM physical spaceImageType::DirectionType d=visualizing->GetDirection();vtkMatrix4x4 *mat=vtkMatrix4x4::New(); //identity matrixfor (int i=0; i<3; i++)for (int k=0; k<3; k++)mat->SetElement(i,k, d(i,k));ImageType::PointType origin=visualizing->GetOrigin();volume->SetOrigin(-origin[0], -origin[1], -origin[2]);volume->SetPosition(-origin[0], -origin[1], -origin[2]);for (int i=0; i<3; i++)mat->SetElement(i,3, origin[i]);volume->SetUserMatrix(mat);vtkRenderer *renderer = myQWidget->GetRenderWindow()->GetRenderers()->GetFirstRenderer();renderer->AddVolume( volume );myQWidget->GetRenderWindow()->Render();renderer->ResetCamera();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 8.0中引入的选项和变量(三)

以下是在MySQL 8.0中新增的系统变量、状态变量和服务选项&#xff1a; • authentication_ldap_sasl_log_status: LDAP服务器日志级别。MySQL 8.0.11版本新增。 • authentication_ldap_sasl_max_pool_size: LDAP服务器最大连接池大小。MySQL 8.0.11版本新增。 • authenticat…

拼多多商家电话采集软件使用教程

拼多多作为一个中国著名的电商平台&#xff0c;拥有大量的商家信息。如果您需要采集拼多多商家的联系电话&#xff0c;可以使用Python编写一个简单的爬虫程序来实现。下面是一个基本的教程&#xff0c;帮助您使用拼多多商家电话采集软件。 步骤1&#xff1a;安装Python和相关库…

rust获取本地ip地址的方法

大家好&#xff0c;我是get_local_info作者带剑书生&#xff0c;这里用一篇文章讲解get_local_info的使用。 get_local_info是什么&#xff1f; get_local_info是一个获取linux系统信息的rust三方库&#xff0c;并提供一些常用功能&#xff0c;目前版本0.2.4。详细介绍地址&a…

【问题记录】使用命令语句从kaggle中下载数据集

从Kaggle中下载Tusimple数据集 1.服务器环境中安装kaggle 使用命令&#xff1a;pip install kaggle 2.复制下载API 具体命令如下&#xff1a; kaggle datasets download -d manideep1108/tusimple3.配置kaggle.json文件 如果直接使用命令会报错&#xff1a; root:~# kagg…

Pandas实战100例 | 案例 62: 计算累计统计量

案例 62: 计算累计统计量 知识点讲解 在数据分析中&#xff0c;计算累计统计量&#xff08;如累计和、累计最大值、累计最小值等&#xff09;是一种常见的操作。Pandas 提供了简单的方法来计算这些统计量。 计算累计统计量: cumsum(): 计算累计和。cummax(): 计算累计最大值…

力扣hot100 二叉树中的最大路径和 递归

Problem: 124. 二叉树中的最大路径和 文章目录 解题方法复杂度&#x1f496; Code 解题方法 &#x1f468;‍&#x1f3eb; 参考思路 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) &#x1f496; Code /*** Definition for a binary tree no…

云计算概述(发展过程、定义、发展阶段、云计算榜单)(一)

云计算概述&#xff08;一&#xff09; &#xff08;发展过程、定义、发展阶段、云计算榜单&#xff09; 本文目录&#xff1a; 零、00时光宝盒 一、前言 二、云计算的发展过程 三、云计算的定义 四、云计算发展阶段 五、云计算公司榜单看云计算兴衰 六、参考资料 零、0…

【Shell编程练习】编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态

系列文章目录 输出Hello World 通过位置变量创建 Linux 系统账户及密码 监控内存和磁盘容量&#xff0c;小于给定值时报警 猜大小 输入三个数并进行升序排序 系列文章目录编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态 编写脚本测试 192.…

mysql 8.0 双密码

当需要定期修改密码&#xff0c;又不想影响现有连接的情况下&#xff0c;怎么才能做到无缝切换呢 添加新密码 ALTER USER appuser1host1.example.com IDENTIFIED BY password_b RETAIN CURRENT PASSWORD; 废弃旧密码 ALTER USER appuser1host1.example.com DISCARD OLD PASS…

大功率直流电子负载

大功率直流电子负载专门用于测试和模拟电源设备的设备&#xff0c;它可以模拟实际的负载情况&#xff0c;对电源设备进行各种性能参数的测试。这种设备在电源设备的研发、生产和质量控制中起着重要的作用。 大功率直流电子负载的主要特点有&#xff1a; 高功率&#xff1a;大功…

中科院自动化所:基于关系图深度强化学习的机器人多目标包围问题新算法

摘要&#xff1a;中科院自动化所蒲志强教授团队&#xff0c;提出一种基于关系图的深度强化学习方法&#xff0c;应用于多目标避碰包围(MECA)问题&#xff0c;使用NOKOV度量动作捕捉系统获取多机器人位置信息&#xff0c;验证了方法的有效性和适应性。研究成果在2022年ICRA大会发…

Pandas实战100例 | 案例 46: 列重新排序

案例 46: 列重新排序 知识点讲解 在某些情况下&#xff0c;你可能需要改变 DataFrame 中列的顺序。Pandas 允许你通过指定列名的列表来重新排列列的顺序。 列重新排序: 通过指定列名的新顺序列表&#xff0c;可以对 DataFrame 的列进行重新排序。 示例代码 # 准备数据和示…

生鲜超市网站系统源码自营商城生鲜水果商城PC手机微信完整版

系统主要功能&#xff1a;商品管理、会员管理、订单管理、电子券管理、财务管理、门店管理等 后台管理&#xff1a;http://fresh.oostar.cn/admin 演示管理员登陆账号:yanshi 演示管理员登陆密码:yanshi888 pc前端站点&#xff1a;http://fresh.oostar.cn 移动端站点&…

淘宝搜索引擎API接口关键字搜索商品列表获取商品详情价格评论销量API

item_search-按关键字搜索淘宝商品 公共参数 查看API完整文档 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,it…

产品运营--面试必会

工作内容&#xff1a; 行业竞品调研 包括&#xff1a; 产品上线的新功能发布的活动&#xff08;活动方案、活动头图设计、运营的策略、奖励机制、开展活动的数据分析、带来的收益和影响&#xff09; 用户需求逻辑催生产品策略 场景时间段用户需求频率、路径 产品、路径…

Mac安装MySQL

环境 电脑: macOS Monterey 12.7.2 MacBook Pro( Retina, 13-inch, Early 2015) 处理器: 2.7GHz 双核 Inter Core i5 MySQL 的安装版本: 8.2.0 最近有更新系统, 重新配置了电脑, 因此, 之前安装的 MySQL 也都删除了, 这次安装经历有点坎坷, 记录下来, 希望可以帮助到需要的小伙…

1.12号网络

1 网络发展历史 1.1 APRAnet阶段 阿帕网&#xff0c;是Interne的最早雏形 不能互联不同类型的计算机和不同类型的操作系统 没有纠错功能 1.2 TCP/IP两个协议阶段 什么是协议 在计算机网络中&#xff0c;要做到有条不紊的交换数据&#xff0c;需要遵循一些事先约定好的规则…

(程序员专用简历助手)Prompt提示词

程序员专用简历助手 给大家提供了两种Prompt模版第一种是程序员通用型第二个是Java面试简历模版 给大家提供了两种Prompt模版 首先感谢大家的订阅&#xff0c;我会尽可能多的去提供给大家各种Prompt模版&#xff0c;第一次给大家提供了这两种Prompt模版&#xff0c;可以让chat…

Transformer详解(附代码实现及翻译任务实现)

一&#xff1a;了解背景和动机 阅读Transformer论文&#xff1a; 阅读原始的Transformer论文&#xff1a;“Attention is All You Need”&#xff0c;由Vaswani等人于2017年提出&#xff0c;是Transformer模型的开创性工作。 二&#xff1a;理解基本构建块 注意力机制&#…