VTKmimics Calculate Parts

news2024/11/19 21:22:57

前言:本博文主要研究mimics中Calculate Parts所采用的方法以及VTK中三维重建的方法,希望对各位小伙伴有所帮助,谢谢!

mimics-Calculate parts - Interpolation

Gray Interpolation

灰度值插值是一种真正的3D插值,它考虑了部分体积效应,因此更准确。使用灰度值插值方法,我们假设骨密度给出了一个像素内骨骼数量的指示。根据灰度值确定表面的所有边缘。另外,这两个像素之间的位置是基于这两个像素的灰度值。

灰度值插值的优点是它提供了大量的细节和尺寸是正确的。缺点是,你得到不必要的细节,由于在图像中的噪声。以大腿骨为例,当使用这个灰度值插值时,你会得到更好的结果(意思是:一个很好的圆润边缘)。当然,你也需要做一些平滑来减少噪音。

然而,重要的是要认识到,灰度值插值并不总是产生良好的结果。当扫描的切片距离明显偏离切片厚度时,得到的网格表面会产生噪声。只有当切片厚度和切片距离相同时,灰度值插值才能很好地工作。在扫描(采集)过程中应满足此条件。因此,Z分辨率的变化(参见关于矩阵缩减的段落)不应与灰度值插值结合使用。降低XY分辨率并不违反该条件。

灰度值插值建议用于CT技术应用。

Contour Interpolation

​​​​​​​

 轮廓插值是在图像平面上平滑扩展到三维空间的二维插值。该插值算法在切片内使用灰度值插值,但在Z方向上使用轮廓之间的线性插值(如下图所示)。这种插值方法为医疗目的提供了最好的结果。

vtkContourFilter

描述:vtkContourFilter是一个过滤器,接受任何数据集的输入并输出等值面或等值线。输出的形式取决于输入数据的维数。若输入数据包含3D单元,则输出等值面。若输入数据包含2D单元,则输出等值线。同样的,若输入数据包含1D或0D,则输出等指点。如果输入维度为混合的,则可以输出混合类型。

ComputeNormal():Set/Get法线的计算。计算法线相当耗费时间和内存。如果输出数据将由修改拓扑或几何的过滤器处理,那么关闭法线和梯度可能是明智的。对于vtkImageData, vtklineargrid, vtkStructuredGrid和vtkUnstructuredGrid输入,此设置默认为On,而对于所有其他输入则为Off。

vtkSynchronizedTemplates3D

描述:用于从结构数据生成等值面。vtkSynchronizedTemplates3D是同步模板算法的3D实现。注意,vtkContourFilter将在适当的时候自动使用这个类。该接口只针对3D图像。

核心函数为ContourImage

根据Image以及设定的Contour值,寻找Contour的边界;

根据添加的点以及所在的位置,建立拓扑关系(拓扑关系基于两个Table进行);

若输入图像为多值图像,即不是二值图像,添加的点会进行插值;

测试代码

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);

#include "vtkSmartPointer.h"

#include "vtkCamera.h"
#include "vtkDoubleArray.h"
#include "vtkImageData.h"
#include "vtkImageProperty.h"
#include "vtkImageReslice.h"
#include "vtkImageSincInterpolator.h"
#include "vtkImageSlice.h"
#include "vtkImageSliceMapper.h"
#include "vtkInteractorStyleImage.h"
#include "vtkPNGReader.h"
#include "vtkPointData.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"

#include "vtkTestUtilities.h"
#include <vtkImageData.h>
#include <vtkMetaImageReader.h>
#include <vtkContourFilter.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSTLWriter.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataNormals.h>
#include <vtkStripper.h>
#include <vtkXMLPolyDataReader.h>
#include <vtkImageResliceMapper.h>

#include "zxContourFilter.h"

void CreateColorImage(vtkImageData* image);

int main()
{

    vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
    CreateColorImage(image);

    zxContourFilter* filter = zxContourFilter::New();
    filter->SetInputData(image);
    filter->SetValue(0, 4);
    //filter->GenerateValues(3, -10., 10.);
    filter->Update();

    vtkSTLWriter* writer = vtkSTLWriter::New();
    writer->SetFileName("F:\\contourPolyData.stl");
    writer->SetInputData(filter->GetOutput());
    writer->Write();

    /*vtkPolyDataNormals* normals = vtkPolyDataNormals::New();
    normals->SetInputData(filter->GetOutput());
    normals->SetFeatureAngle(60);
    normals->SetComputePointNormals(true);
    normals->Update();

    vtkSTLWriter* writer2 = vtkSTLWriter::New();
    writer2->SetFileName("F:\\contourNormals.stl");
    writer2->SetInputData(normals->GetOutput());
    writer2->Write();

    vtkStripper* stripper = vtkStripper::New();
    stripper->SetInputData(normals->GetOutput());
    stripper->Update();*/

    /*vtkSTLWriter* writer3 = vtkSTLWriter::New();
    writer3->SetFileName("F:\\contourStripper.stl");
    writer3->SetInputData(stripper->GetOutput());
    writer3->Write();*/

    vtkPolyDataMapper* contourMapper = vtkPolyDataMapper::New();
    contourMapper->SetInputData(filter->GetOutput());
    vtkActor* contourActor = vtkActor::New();
    contourActor->SetMapper(contourMapper);

    // Setup renderers
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    //renderer->AddViewProp(imageSlice);
    renderer->AddActor(contourActor);
    renderer->ResetCamera();

    // Setup render window
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->SetSize(300, 300);
    renderWindow->AddRenderer(renderer);

    // Setup render window interactor
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();

    vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
        vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();

    renderWindowInteractor->SetInteractorStyle(style);

    // Render and start interaction
    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderWindow->Render();
    renderWindowInteractor->Initialize();

    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

void CreateColorImage(vtkImageData* image)
{
    int directSize = 7;
    int zSize = 5;
    image->SetDimensions(directSize, directSize, zSize);
    image->AllocateScalars(VTK_UNSIGNED_CHAR, 1);

    for (unsigned int z = 0; z < zSize; z++)
    {
        for (unsigned int y = 0; y < directSize; y++)
        {
            for (unsigned int x = 0; x < directSize; x++)
            {
                unsigned char* pixel = static_cast<unsigned char*>(image->GetScalarPointer(x, y, z));
                pixel[0] = 0;
            }
        }
    }
    for (unsigned int z = 1; z < 5; z++)
    {
        for (unsigned int y = z; y < directSize -z; y++)
        {
            for (unsigned int x = z; x < directSize - z; x++)
            {
                unsigned char* pixel = static_cast<unsigned char*>(image->GetScalarPointer(x, y, z));
                pixel[0] = 4;
            }
        }
    }
}


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

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

相关文章

【C++学习第十一讲】C++数据类型

文章目录 一、编程语言中的数据类型1.1 整型&#xff08;Integer&#xff09;1.2 浮点型&#xff08;Floating-Point&#xff09;1.3 字符型&#xff08;Character&#xff09;1.4 布尔型&#xff08;Boolean&#xff09;1.5 数组&#xff08;Array&#xff09;1.6 字符串&…

TitanIDE:环境安装部署教程

随着市场需求的迅速增长和技术的不断发展&#xff0c;云原生不仅仅是一种技术&#xff0c;更是一种思想。它通过容器化、微服务化、自动化等技术手段&#xff0c;推动了应用程序设计和交付的转变&#xff0c;使应用程序的开发、测试、部署和管理变得更加高效和灵活。 随着市场需…

【多线程】| 线程冲突解决方案

目录 &#x1f981; 线程同步1.什么是线程冲突&#xff1f;2.什么是线程同步&#xff1f;3.解决线程同步的方案3.1语法结构3.2synchronized使用 &#x1f981; synchronized详细用法1. 使用this作为线程锁对象1.1 语法结构&#xff1a;1.2 使用说明 2. 使用字符串作为线程对象锁…

lwIP更新记04:TCP 初始序列号

从 lwIP-2.0.0 开始&#xff0c;可以自定义 TCP 报文段的初始序列号。 TCP 报文段首部有一个序列号字段&#xff0c;它是一个32位的计数器&#xff0c;从 0 到 4294967295&#xff0c;它的值为当前报文段中第一个数据的字节序号。TCP 在建立连接的时候需要初始序列号&#xff…

JVM系列-第11章-垃圾回收相关概念

垃圾回收相关概念 System.gc() 的理解 在默认情况下&#xff0c;通过System.gc()者Runtime.getRuntime().gc() 的调用&#xff0c;会显式触发Full GC&#xff0c;同时对老年代和新生代进行回收&#xff0c;尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声…

小航助学2022年NOC初赛图形化(小高组)(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题3.0分 删除编辑 答案:C 第1题如果要控制所有角色一起朝舞台区右侧移动&#xff0c;下面哪个积木块是不需要的&#xff1f; A…

微签助力中融基金电子文件安全高效签章

中融基金重安全&#xff0c;炼丹炉里炼微签 这次讲一个微签在炼丹炉里炼出了火眼金睛的故事。 先看一个数字。 金融隐私泄露事件大约以每年35&#xff05;的数据在增长。 数字来自《中国银行保险报》与亚信网络安全产业技术研究院发布的《金融行业网络安全白皮书》。 大数据时…

「车型分析」控制系统典型应用车型 —— 辊筒AGV

辊筒AGV (Roller conveyor ) 是一种常见的AGV机器人类型&#xff0c;它利用辊筒和轮子在巷道中实现货物的搬运和运输&#xff0c;可实现托盘物品的卸载和运输等功能, 具有更高的灵活性、适应性和效率。本文将基于这款市场上常见的AGV进行一次简单的介绍。 1 车型介绍: 辊筒AGV…

深度学习中必备的算法:神经网络、卷积神经网络、循环神经网络

深度学习是一种新兴的技术&#xff0c;已经在许多领域中得到广泛的应用&#xff0c;如计算机视觉、自然语言处理、语音识别等。在深度学习中&#xff0c;算法是实现任务的核心&#xff0c;因此深度学习必备算法的学习和理解是非常重要的。 本文将详细介绍深度学习中必备的算法…

2023彩虹易支付最新原版安装教程(内附源码)

此源码已通过检查&#xff0c;确认无后门&#xff0c;且所有代码开源&#xff0c;无加密文件。 测试日期 2023年5月21日 源码已扫描无后门&#xff0c;不放心的也可以自己再去扫描一遍 2023年5月22日 各个功能接口测试完毕&#xff0c;均可用 选中下方可查看下载链接 http…

gcc、makefile和git(二)

简介 现在讲述如何写 makefile 的文章很多&#xff0c;从几页的简易版到几十页、几百页的详细版都有。Makefile 有自己的书写格式、关键字、函数、隐含规则&#xff0c;像C语言一样灵活多变、功能强大。在Makefile中还可以使用系统shell所提供的任何命令来完成想要的工作&#…

国资油企能向民营市场借鉴些什么?

在中国石油集团召开的全面深化改革领导小组第四十三次会议上&#xff0c;集团公司董事长、党组书记、全面深化改革领导小组组长戴厚良强调&#xff1a;要深入推进公司治理体系和治理能力现代化&#xff0c;推进信息化、数字化和智能化工作。实现制度流程化、流程信息化。立足长…

GEE土地利用产品汇总

一、ESA产品&#xff1a; 10米分辨率&#xff0c;目前只有2020年和2021年的数据 &#xff08;1&#xff09;ESA WorldCover 10m v100&#xff08;只有2020年数据&#xff09; 代码&#xff1a; var dataset ee.ImageCollection(ESA/WorldCover/v100).first();var visualizat…

写给Android工程师的 Github CI 快速指北

背景 关于 CI/CD &#xff0c;在2023年的今天&#xff0c;基本所有技术团队或多或少都会使用&#xff0c;其很大程度上减轻了我们的冗余重复工作&#xff0c;从而简化我们的工作流程。 不过对于大多数客户端工程师而言&#xff0c;其实 CI 这个词还是比较陌生。当然并不是说&…

Unity - 解决TMP FontAssetCreator 在生成 SDF 时 Font 显示 ????? 的问题

文章目录 原因问题解决下载 FontCreator&#xff0c;并打开有问题的字体修改字体属性重新导出字体 返回 Unity 后重新使用 TMP Font Asset Creator 来生成 原因 美术找到一个字体和某个参考的某个游戏的字体是一致 美术同学截图了参考的游戏&#xff0c;和 自己找到的 字体 放…

Mybatis查询语句汇总与小技巧

前言 在之前的学习中&#xff0c;使用到了将查询结果封装到bean对象内&#xff0c;使用到了将查询结果封装的bean对象封装到List集合中&#xff0c;但是如果我们没有对应的bean对象&#xff0c;我们应该将结果封装到哪呢&#xff1f;今天这篇文章就记录一下几种常见查询结果的封…

用蹩脚英语在StackOverflow上飞奔:试看以色列兄弟自荐的Http文件上传工具MgntUtils

上班摸鱼、下班干活&#xff0c;日常埋坑、加班填坑——这是我的搬砖&#xff0c;亦是在座的各位&#xff01; 文章目录 1.试看MgntUtils来源2.下载MgntUtils源码3.初探源码4.验证API 1.试看MgntUtils来源 ​ ​上篇文章说到&#xff0c;有个以色列大兄弟在回答Stack Overflow…

13岁青少年DAO创始人:Web3治好了我的“丧”

“我看大家都死气沉沉的&#xff0c;大家都站起来活动活动。” 4月&#xff0c;香港Web3嘉年华的一场沙龙&#xff0c;橙色针织帽给黑压压的现场带来一抹亮色&#xff0c;13岁的Carry Zheng戴着它登台&#xff0c;没有“大家好”的寒暄&#xff0c;直接向台下的成年人发出指令&…

训练营-5月

JAVA训练营-5月 一、环境 1、idea安装 idea就是一个开发工具&#xff0c;写代码的地方 目录结构&#xff1a; --- 项目&#xff08;工程 project&#xff09; 比如&#xff1a;京东 ---- 模块&#xff08;module&#xff09; 比如&#xff1a;订单、购物车、秒杀等 -----…

ALOHA 开源机械臂(Viper 300 Widow X 250 6DOF机械臂 远程操控系统)第四部分

Teleoperation System 远程操作系统 We introduce ALOHA: A Low-cost Open-source Hardware System for Bimanual Teleoperation. With a $20k budget, it is capable of teleoperating precise tasks such as threading a zip tie, dynamic tasks such as juggling a ping p…