前言:本博文主要研究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 renderersvtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();//renderer->AddViewProp(imageSlice);renderer->AddActor(contourActor);renderer->ResetCamera();// Setup render windowvtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->SetSize(300, 300);renderWindow->AddRenderer(renderer);// Setup render window interactorvtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();renderWindowInteractor->SetInteractorStyle(style);// Render and start interactionrenderWindowInteractor->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;}}}
}

VTKmimics Calculate Parts相关推荐

  1. Automatic differentiation

    看算法看到这个了,转载一下,备忘. From Wikipedia, the free encyclopedia Jump to: navigation, search In mathematics a ...

  2. html计算平均分,Calculate phastCon Score for a gene —- 计算基因的phastCon平均分,判断基因保守型...

    Calculate phastCon Score for a gene -- 计算基因的phastCon平均分,判断基因保守型 PhastCon socre is the score from 0 t ...

  3. Maven 的Could not calculate build plan错误解决方法(不一定适用,看原因)

    Maven 的Could not calculate build plan错误解决方法(不一定适用,看原因): 1.将C:\Users\a\.m2\repository\org\apache\mave ...

  4. CUDA Samples: Calculate Histogram(atomicAdd)

    以下CUDA sample是分别用C++和CUDA实现的计算一维直方图,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第九章,各个文件内容如下 ...

  5. [记录]calculate age based on date of birth

    calculate age based on date of birth know one new webiste:eval.in run php code 转载于:https://www.cnblo ...

  6. 自定义表单mysql_自定义表单,计算答案然后更新mysql DB(Custom form, calculate answer then update mysql DB)...

    自定义表单,计算答案然后更新mysql DB(Custom form, calculate answer then update mysql DB) 我想要实现的是用户购买代币时的模拟支付系统. 我坚 ...

  7. R语言使用dplyr包使用group_by函数、summarise函数和mutate函数计算分组下的均值、标准差、样本个数、以及分组均值的95%执行区间对应的下限值和上限值(Calculate CI)

    R语言使用dplyr包使用group_by函数.summarise函数和mutate函数计算分组下的均值.标准差.样本个数.以及分组均值的95%执行区间对应的下限值和上限值(Calculate 95% ...

  8. SAP WM LPK1 不能把 cross-material control cycles定义成release order parts

    SAP WM LPK1 Error Message - Do not define cross-material control cycles for release order parts – 但是 ...

  9. Eclipse创建的Maven项目报错Could not calculate build plan: Plugin

    Eclipse创建的Maven项目报错Could not calculate build plan: Plugin 2018年05月10日 21:59:25 TIMI-Nian 阅读数:5040 标签 ...

最新文章

  1. Mysql报错Forcing close of thread 139 user: 'root'
  2. 【开源】SpringBootNetty聊天室V1.2.0升级版本介绍
  3. java笔记之数组的概念、声明、初始化、访问方式、复制和动态扩展算法以及递归...
  4. 图像工程CH4 频域图像增强
  5. httpf发送 json_Java用HttpClient3发送http/https协议get/post请求,发送map,json,xml,txt数据...
  6. 解决IDEA GIT密码输入错误后,报Authentication failed ... 不再弹出输入框,提交更新失败
  7. angular2 学习笔记 ( unit test 单元测试 )
  8. Java实现对称加密算法-AES加解密
  9. 第四次作业3 四则运算试题生成
  10. UIAlertView用法
  11. windows安装office2016
  12. Allegro_SMT手工焊接辅助程序
  13. jssdk 获取微信收货地址_微信公众号JSSDK 获取经纬度
  14. 《攻城Online》快速原型:服务端设计
  15. uniapp 分享功能(app , 小程序)
  16. BINKS 502375润滑脂
  17. matlab去除图片水印_怎么用matlab从含有水印的图像中提取出水印
  18. 【论文阅读】Feature Denoising for Improving Adversarial Robustness
  19. 物料需求计划MRP(一)主生产计划
  20. 从零开始perp交叉编译及配置

热门文章

  1. (二) CPU 性能测试 (不同品牌CPU算力比较)
  2. 2022年武汉市东西湖区科技成果转化活动奖励补贴政策申报条件
  3. windows cmd导出电脑已经连过的wifi密码
  4. 秀杰音乐盒之mtv播放器 v1.0 怎么用
  5. 城市生活垃圾类毕业论文文献包含哪些?
  6. linux 和 Windows下FFTW库的安装
  7. set-valued function called in context that cannot accept a set
  8. 为什么总有人会认为斗地主靠运气就能打好?
  9. c语言编写已知xyz,C语言编程基础——xyzGame小游戏合集
  10. 基于OSI模型的车载以太网