VTK 读取、预处理、处理和可视化医学图像数据的过程


开发环境:

  1. Windows 11 家庭中文版
  2. Microsoft Visual Studio Community 2019
  3. VTK-9.3.0.rc0
  4. vtk-example

demo解决问题: VTK 读取、预处理、处理和可视化医学图像数据的过程

图像读取和预处理:

  1. 程序使用 VTK 的图像阅读器vtkImageReader2Factory类读取作为命令行参数指定的输入图像文件。
    程序会对输入图像数据进行类型转换vtkImageCast,将标量类型转换为 double 类型,以便进一步处理。
  2. 对图像数据应用高斯平滑滤波器vtkImageGaussianSmooth,以减少噪音并创建更平滑的表示。

图像处理:

  1. 定义隐式球形函数vtkSphere并对其进行采样vtkSampleFunction(m2->SetImplicitFunction(m1);),以在图像数据中创建感兴趣的球形区域。
  2. 然后对采样球进行缩放vtkImageShiftScale(m3->SetInputConnection(m2->GetOutputPort());此处输入时上一步中的感兴趣输出),并使用乘法对原始图像数据进行数学运算vtkImageMathematics,从而有效地应用遮罩。

可视化:

  1. 程序使用 VTK 的图像演员类vtkImageActor为原始图像和滤波图像设置演员。
  2. 程序还定义了视口,用于在渲染窗口中显示原始图像和滤波图像。
  3. 程序还创建了两个独立的呈现器,用于在呈现窗口中并排显示原始图像和滤波图像。
  4. 然后,程序初始化呈现窗口,设置交互样式,并显示图像供用户交互。

以上演示了在一个应用程序中使用 VTK 读取、预处理、处理和可视化医学图像数据的过程。


prj name: AttachAttributes

#include <vtkImageActor.h>
#include <vtkImageCast.h>
#include <vtkImageGaussianSmooth.h>
#include <vtkImageMapper3D.h>
#include <vtkImageMathematics.h>
#include <vtkImageProperty.h>
#include <vtkImageReader2.h>
#include <vtkImageReader2Factory.h>
#include <vtkImageShiftScale.h>
#include <vtkInteractorStyleImage.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSampleFunction.h>
#include <vtkSphere.h>/*
这张核磁共振成像图显示了传感器位置可能导致的衰减。
通过除以人工确定的衰减曲线,可以去除伪影。该直方图显示了伪影如何以标量值簇的形式隐藏信息。
*/
int main(int argc, char* argv[])
{// Verify input arguments.if (argc != 2){std::cout << "Usage: " << argv[0]<< " Filename e.g. AttenuationArtifact.pgm" << std::endl;return EXIT_FAILURE;}/*vtkImageReader2Factory: 该类用于在给定文件路径名的情况下创建 vtkImageReader2 对象。它会在所有可用的阅读器上调用 CanReadFile,直到其中一个返回 true。可用的阅读器列表来自三个地方。在该类的 InitializeReaders 函数中,内置的 VTK 类会被添加到列表中,用户可以调用 RegisterReader,或者用户可以创建一个具有 CreateObject 方法的 vtkObjectFactory,该方法会在给定字符串 "vtkImageReaderObject "时返回一个新的 vtkImageReader2 子类。这样,应用程序就可以通过插件 dll 或调用 RegisterReader 来扩展新的阅读器。当然,vtk 发行版中的所有阅读器都会自动可用。*/// Read the imagevtkNew<vtkImageReader2Factory> readerFactory;vtkSmartPointer<vtkImageReader2> reader;reader.TakeReference(readerFactory->CreateImageReader2(argv[1]));reader->SetFileName(argv[1]);//vtkImageCast 过滤器会转换输入类型以匹配图像处理管道中的输出类型。//如果输入已具有正确的类型,则该过滤器不会执行任何操作。要指定 "CastTo "类型,请使用 "SetOutputScalarType "方法。vtkNew<vtkImageCast> cast;cast->SetInputConnection(reader->GetOutputPort());cast->SetOutputScalarTypeToDouble();// Get rid of discrete scalars.vtkNew<vtkImageGaussianSmooth> smooth;smooth->SetInputConnection(cast->GetOutputPort());smooth->SetStandardDeviations(0.8, 0.8, 0);vtkNew<vtkSphere> m1;m1->SetCenter(310, 130, 0);m1->SetRadius(0);vtkNew<vtkSampleFunction> m2;m2->SetImplicitFunction(m1);m2->SetModelBounds(0, 264, 0, 264, 0, 1);m2->SetSampleDimensions(264, 264, 1);//使用vtkImageShiftScale可以对像素进行平移(添加一个常量值)和缩放(乘以一个标量)。//作为一种便利,这个类允许你设置输出标量类型,类似于vtkImageCast。这是因为平移缩放操作经常会转换数据类型。vtkNew<vtkImageShiftScale> m3;m3->SetInputConnection(m2->GetOutputPort());m3->SetScale(0.000095);//https://blog.csdn.net/fandq1223/article/details/53185464vtkNew<vtkImageMathematics> div;div->SetInputConnection(0, smooth->GetOutputPort());div->SetInputConnection(1, m3->GetOutputPort());div->SetOperationToMultiply();// Create actors.vtkNew<vtkNamedColors> colors;double colorWindow = 256.0;double colorLevel = 127.5;vtkNew<vtkImageActor> originalActor;originalActor->GetMapper()->SetInputConnection(cast->GetOutputPort());originalActor->GetProperty()->SetColorWindow(colorWindow);originalActor->GetProperty()->SetColorLevel(colorLevel);vtkNew<vtkImageActor> filteredActor;filteredActor->GetMapper()->SetInputConnection(div->GetOutputPort());// Define viewport ranges.// (xmin, ymin, xmax, ymax)double originalViewport[4] = {0.0, 0.0, 0.5, 1.0};double filteredViewport[4] = {0.5, 0.0, 1.0, 1.0};// Setup renderers.vtkNew<vtkRenderer> originalRenderer;originalRenderer->SetViewport(originalViewport);originalRenderer->AddActor(originalActor);originalRenderer->ResetCamera();originalRenderer->SetBackground(colors->GetColor3d("SlateGray").GetData());vtkNew<vtkRenderer> filteredRenderer;filteredRenderer->SetViewport(filteredViewport);filteredRenderer->AddActor(filteredActor);filteredRenderer->ResetCamera();filteredRenderer->SetBackground(colors->GetColor3d("LightSlateGray").GetData());vtkNew<vtkRenderWindow> renderWindow;renderWindow->SetSize(600, 300);renderWindow->AddRenderer(originalRenderer);renderWindow->AddRenderer(filteredRenderer);renderWindow->SetWindowName("Attenuation");vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;vtkNew<vtkInteractorStyleImage> style;renderWindowInteractor->SetInteractorStyle(style);renderWindowInteractor->SetRenderWindow(renderWindow);renderWindow->Render();renderWindowInteractor->Initialize();renderWindowInteractor->Start();return EXIT_SUCCESS;
}

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

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

相关文章

继电保护-变压器纵联差动保护MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 原理概述 差动保护是在两端设置的保护&#xff0c;通过比较两端测回来的电气量&#xff0c;进而看是否需要动作&#xff0c;纵联差动保护是变压器主保护。 纵联差动保护基本原则 双绕组变压器实现纵联差动…

notepad ++ 常用快捷键 【程序员必看】

目录 notepad 常用快捷键 一 安装notepad 二 快捷键 三 改变主题 四 设置tab键 五 自动换行 六 自动补全 七 创建保存文件 八同时编辑两个文件 九保持Notepad代码高亮风格到网页或word中 十插件安装 十一使用notepad解决实际问题 CtrlC 复制 CtrlX 剪切 CtrlV 粘贴…

泄密零容忍!迅软科技打造设计图纸安全防线,助您无忧创作!

对于建筑设计、鞋服设计、动漫设计、平面设计等设计行业而言&#xff0c;海量设计图纸都以电子数据的形式存在企业的终端电脑上&#xff0c;这些图纸蕴含着企业的核心竞争资源&#xff0c;一旦泄露将给企业带来巨大的经济损失。 因此&#xff0c;迅软科技采用了先进的数据加密技…

Ruoyi-cloud / 若依 SpringCloud服务器部署

1、redis 环境 服务器安装redis &#xff0c;注意 密码 端口 2、mysql 环境 服务器安装 mysql 5.7 以上的版本 代码中的sql 文件夹中有 sql 文件 创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&…

同旺科技 USB 转 RS-485 适配器 -- 隔离型

内附链接 1、USB 转 RS-485 适配器 隔离版主要特性有&#xff1a; ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB总线供电&#xff1b; ● 支持Windows系统驱动&#xff0c;包含WIN10 / WIN11 系统32 / 64位&#xff1b; ● 支持Windows …

使用vue-admin-template时,需要注意的问题,包括一定要去除mock.js注释

在使用vue-admin-template等前端框架时&#xff0c;如果你没有打算用他们的mock数据&#xff0c;在生产环境下一定要注释mock引用的代码&#xff0c;虽然它没有被调用&#xff0c;但是如果你不注释&#xff0c;就会被打包进去。 找到main.js&#xff0c;看如下代码&#xff1a…

读天下杂志读天下杂志社读天下编辑部简介

《读天下》杂志是国家新闻出版署批准,吉林省舆林报刊发展有限责任公司主管,吉林省舆林报刊发展有限责任公司主办的面向全国发行的艺术文化生活期刊。国内统一刊号&#xff1a;CN:22-1401/G2&#xff0c;国际标准刊号&#xff1a;ISSN:2095-2112。 《读天下》投稿邮箱&#xff1…

八、Lua数组和迭代器

一、Lua数组 数组&#xff0c;就是相同数据类型的元素按一定顺序排列的集合&#xff0c;可以是一维数组和多维数组。 在 Lua 中&#xff0c;数组不是一种特定的数据类型&#xff0c;而是一种用来存储一组值的数据结构。 实际上&#xff0c;Lua 中并没有专门的数组类型&#xf…

根据端口查找进程

关闭kibana kibana自带命令 kibana没有提供关闭命令&#xff0c;通过命令 ps -ef|grep kibana查找不到kibana相关的信息。 可以通过进程暴露的端口来查找 netstat -anltp|grep 5601获取到进程号&#xff0c;然后kill掉进程 kill -9 进程号Docker管理Kibana 但是如果使用D…

OpenHarmony亮相MTSC 2023 | 质量效率共进,赋能应用生态发展

11月25日&#xff0c;MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行。大会以“软件质量保障体系和测试研发技术交流”为主要目的&#xff0c;旨在为行业搭建一个深入探讨和交流的桥梁和平台。OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&a…

Linux概述

Linux概述 1、操作系统 ​ 定义&#xff1a;操作系统(Operating System&#xff0c;简称OS)是管理计算机硬件与软件资源的计算机程序 ​ 作用&#xff1a;是把计算机系统中对硬件设备的操作封装起来&#xff0c;供应用软件调用&#xff0c;也是提供一个让用户与系统交互的操…

C++基础 -10- 类的构造函数

类的构造函数类型一 使用this指针给类内参数赋值 class rlxy {public:int a;rlxy(int a, int b, int c){this->aa;this->bb;this->cc;cout << "rlxy" << endl;}protected:int b;private:int c; };int main() {rlxy ss(10, 20, 30); }类的构造…

winform 程序多语言

新建一个winform程序添加资源文件 在多语言的资源文件中设置key以及value设置button根据环境选择语言文件 namespace WindowsFormsMulLang {public partial class Form1 : Form{public Form1(){InitializeComponent();}public static ResourceManager rm new ResourceManager(…

PHP+vue+elementui高校学生社团信息管理系统o7q4a

社团是由高校用户依据兴趣爱好自愿组成&#xff0c;按照章程自主开展活动的用户组织。高校社团是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高用户综合素质、引导用户适应社会、促进用户交流等方面发挥着重要作用&#xff0c;是新形势下有效凝聚用户…

位运算算法【1】

文章目录 &#x1f34a;面试题 01.01. 判定字符是否唯一&#x1f96d;题目&#x1f351;算法原理&#x1f95d;解法一&#xff1a;哈希表&#x1f95d;解法二&#xff1a;位图 &#x1f951;代码实现 &#x1f33d;268. 丢失的数字&#x1f96c;题目&#x1f344;算法原理&…

Leetcode—2336.无限集中的最小数字【中等】

2023每日刷题&#xff08;四十四&#xff09; Leetcode—2336.无限集中的最小数字 实现代码 class SmallestInfiniteSet {set<int> s; public:SmallestInfiniteSet() {for(int i 1; i < 1000; i) {s.insert(i);}}int popSmallest() {int res *s.begin();s.erase(s…

webpack如何处理css

一、准备工作 新建目录 添加样式 .word {color: red; } index.js添加dom元素&#xff0c;添加一个css word import ./css/index.css;const div document.createElement("div"); div.innerText "hello word!!!"; div.className "word"; do…

Unity安装

DAY1 下载Unity 打开Unity3D官网&#xff0c;下载Unity Hub&#xff0c;管理Unity的软件。链接https://unity.cn/releases (可能需要注册账号&#xff0c;就正常注册登录即可) 如果是新版的hub&#xff0c;可能长下面这个样子&#xff0c;还是英文的&#xff0c;点击圆圈的设…

基于振弦式轴力计和采集仪的安全监测解决方案

基于振弦式轴力计和采集仪的安全监测解决方案 振弦式轴力计是一种测量结构物轴向力的设备&#xff0c;通过测量结构物上的振弦振幅变化&#xff0c;可以确定结构物轴向力的大小。采集仪是一种用于采集和存储传感器数据的设备&#xff0c;通常与振弦式轴力计一起使用&#xff0c…

41.0/查询/sql注入安全问题以及解决方式。

41.1. 回顾 1. jdbc&#xff1a;[java database connection] java连接数据库 2. 完成了增删改操作。 [1]加载驱动。Class.forName("com.mysql.cj.jdbc.Driver"); [2]获取连接对象: Connection connDriverManager.getConnection(url,user,pass); url: jdb…