三维重建 阈值分割 3D可视化 医学图像分割 CT图像分割及重建系统 可视化编程技术及应用

一、 概述

此系统实现了常见的VTK四视图,实现了很好的CT图像分割,可以用于骨骼,头部,肺部,脂肪等分割,,并且通过三维重建实现可视化。使用了第三方库 VTK,ITK 实现分割和生不重建。

窗口分为 (横断面)、冠状面、矢状面,和3D窗口;包含了体绘制和面绘制;

效果:

CT分割重建

二、 开发环境 

操作系统: Windows 10:

工具:Qt 5.12.4+ Visual Studio 2017,

使用开源库:VTK-8.1 ITK4.13。

三、主要任务:

图像的输入与预处理,组织或器官的分割与提取,由二 维轮廓线重构三维形体,基于规则体数据的三维表面重建;

四、图像重建介绍:

1.医学图像分割:
根据需要选择一定的特征量或指定特定的测量准则来检测图像中不同区域的一致性,根据检测出来的区域一致性将图像区别成不同区域,从而可以更加方便地进行进一步的分析和理解

2.医学图像分割方法:
a.基于图像区域的方法:通过检测同一区域内的均匀性是否一致来将图像中的不同区域识别出来。
区域分割方法包括:阈值分割法,区域生长法,基于随机场的方法。
b.基于边缘检测的分割方法:边缘检测技术提取区域进行分割。
常用的边缘检测技术有:并行微分算子、基于边界曲线拟合的方法、基于局部图像的方法、串行边界查找等。
c.结合区域和边缘信息的方法:采用基于形变模型的方法将基于区域的分割方法和边缘检测方法结合起来进行图像分割处理。

3.医学图像三维可视化 :
将医学影像设备输出的二维切片图像序列重新组合重建为三维图像模型,并对重建后的模型进行定性定量分析的技术;

三维重建方法:
a.面绘制:表面重建,即从医学影像设备输出的切片数据集构造出三维数据,然后在三维数据中抽取出等值面,然后进行三角剖分,获得三角形面片,在用图形学中的图元绘制技术将三角形面片绘制出来实现表面绘制。
根据用户需要提取的目标物体的属性设定一个特定的阈值,从体数据中提取到与该阈值相同的数据点,并根据三角剖分分为若干个三角面片集,在利用图形学中基本的三角形图元的绘制方法对三角面片进行渲染,形成三维图像。
常用的面绘制算法有:移动立方体算法,剖分立方体算法,立方体算法。
b.体绘制:。将体数据中的“体素”作为基本的绘制单位。把体数据中的每个体素看成是可以接收或发出光线的点,选择光照模型,对体素进行分类并根据其实际的介质属性分配不同的颜色和不透明度,并沿着视线观察的方向进行合成,在视点所在的位置形成具有一定颜色和透明度的三维投射图像。
常用的体绘制算法有:光线投射算法、错切变形法、和基于硬件的3D纹理映射算法。

医学图像三维重建流程:
获得和封装体数据、模型的建立、映射体数据、三维图形绘制。
体数据分类(根据三维空间上每个数据点之间的相互关系):结构化体数据、非结构化体数据、结构化和非结构化混合型体数据


五、主要实现过程

1.数据读取:


 这里有一个bug,VTK 读取会丢失信息;

后面换成 ITK

2.CT分割

这里我们使用了 阈值分割,则CT图像的CT值在这个阈值内的保留原值不变,小于下界阈值的变黑,大于上界阈值的变白。

可以看到肺部已经被分割出来

4、三维重建:

面绘制,这里使用 阈值分割后的结果:

 

效果,这里使用了 肺部,骨头两种测试:

 体绘制:

这里同样使用阈值分割后的结果

体绘制:

光照与阴影
通过vtkVolumeProperty可以设置体绘制的阴影效果,阴影效果主要受环境光系数、散射光系数、反射光系数和高光强度4个参数影响。
SetDiffuse() //设置散射光系数(使具有立体感)
SetAmbient() //设置环境光系数(光的强度)
SetSpecular() //设置反射光系数(光滑度,明暗)
一般情况下,着三个系数之和为1.
高光强度系数用于控制体绘制外观平滑程度,使用SetSpecularPower()函数设置。
vtkVolumeProperty中默认是关闭阴影效果,因此需要显示调用ShadeOn()函数来打开阴影效果。

光线投射中,投射光线上的采样步长是一个很重的参数,设置函数:SetSampleDistance(float),步长越小,采样点越多,效果越好。但计算量变大。当数据变化剧烈时,应该减少采样步长以获得更好的效果。

 效果如下:

 最后分割出的结果如下:

(横断面)、冠状面、矢状面,三个窗口可以通过拖动条,切换图层; 

由于一些关系,还有些细节不便透露;大体流程如此;

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
医学图像三维重建是通过计算机图形学、数字图像处理技术、计算机可视化以及人机交互等技术,把二维的医学图像序列转换为三维图像在屏幕上显示出来,并根据需要为用户提供交互处理手段的理论、方法和技术。图像分割是进行图像三维重建的必要准备,图像分割效果的优劣直接影响三维重建医学领域的应用医学图像分割三维重建将数字图像处理技术和计算机图形学应用在了在生物医学工程中,该应用涉及到计算机图形学、图像处理技术、生物医学工程等多种技术,该领域的研究多学科交叉的,在医学诊断、手术规划及医学教学等方面有很高的应用价值,是近年来的计算机应用技术的一个研究热点。医学图像分割三维重建是两个不可分割的相关领域。本文研究了基于区域的图像分割和基于边缘的两种图像分割方法在医学图像处理中的应用,并在实验中利用ITK提供的区域生长法成功分割出肝脏、脊柱和肺脏等人体组织器官;三维重建算法分为两类:面绘制和直接体绘制。面绘制从三维体数据中抽取目标对象等值面,通过传统的图形学方法进行渲染;体绘制技术则将整个体数据进行可视化显示,使医生可以通过设置适当的参数调节后观察医学数据的三维内部结构信息。本文研究了光线投射体绘制算法、错切变形法和基于纹理映射的体绘制算法,以及Marching Cubes面绘制算法的实现机制和适用范围,并利用VTK提供的三维重建算法对不同人体部位的组织和器官实现了重建实验。本文主要研究了医学图像分割三维重建技术的应用。在对医学图像分割三维重建基础理论以及三维重建相关的三维切割技术进行研究和实验的基础上,结合医学图像分割开发工具包ITK(Insight ToolKit)和可视化开发包VTK(Vislual ToolKit),以及ActiveX开发技术,设计了一个医学图像三维重建VolumeRenderX控件并通过MFC编程实现。这是一个面向对象、可扩展的跨IDE(Intergreted Development Enviroment)开发平台的开发控件,并针对实际应用需求整合了重建参数调节和重建体剖切等多种实用功能,相对于传统的医学图像处理三维重建系统具有更大的应用价值。本文还提出了一个基于WEB模式的医学图像三维重建的解决方案。
以下是利用Grad-CAM算法进行医学图像分割可视化的示例代码。代码使用的是PyTorch框架。 ```python import torch import torch.nn.functional as F import cv2 import numpy as np import matplotlib.pyplot as plt # 定义Grad-CAM函数 def grad_cam(model, x, layer_name): # 获取目标层的输出特征图和梯度 features_blobs = [] def hook_feature(module, input, output): features_blobs.append(output.data.cpu().numpy()) net._modules.get(layer_name).register_forward_hook(hook_feature) grad_blobs = [] def hook_grad(module, grad_in, grad_out): grad_blobs.append(grad_out[0].cpu().numpy()) net._modules.get(layer_name).register_backward_hook(hook_grad) # 运行模型并计算梯度 output = model(x) one_hot = np.zeros((1, output.size()[-1]), dtype=np.float32) one_hot[0][np.argmax(output.data.cpu().numpy())] = 1 one_hot = torch.from_numpy(one_hot) one_hot.requires_grad = True one_hot = torch.sum(one_hot * output) model.zero_grad() one_hot.backward() grad = grad_blobs[0] feature = features_blobs[0] weights = np.mean(grad, axis=(2, 3))[0, :] cam = np.zeros(feature.shape[2:], dtype=np.float32) for i, w in enumerate(weights): cam += w * feature[0, i, :, :] cam = cv2.resize(cam, x.shape[2:]) cam = np.maximum(cam, 0) heatmap = cam / np.max(cam) return heatmap # 读取图像 img = cv2.imread('test.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.show() # 转换图像为Tensor,并进行预处理 img = cv2.resize(img, (224, 224)) img = np.float32(img) / 255 img = np.transpose(img, (2, 0, 1)) img = torch.from_numpy(img).unsqueeze(0) # 加载模型 model = torch.load('model.pth') model.eval() # 应用Grad-CAM算法 heatmap = grad_cam(model, img, 'features') # 可视化结果 heatmap = cv2.resize(heatmap, (img.shape[3], img.shape[2])) heatmap = np.uint8(heatmap * 255) heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) result = cv2.addWeighted(img.squeeze().numpy().transpose(1, 2, 0), 0.5, heatmap, 0.5, 0) plt.imshow(result) plt.show() ``` 其中,`model.pth`为已经训练好的模型文件,`test.jpg`为待处理图像文件。需要根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值