medimage 发表于 2016-1-8 13:42:00

MITK分割模块之ToolManager

本帖最后由 medimage 于 2016-1-8 14:16 编辑


MITK平台自带分割模块,其中涉及很多交互问题,比如监听鼠标事件,对轮廓的渲染等。对于接触MITK的新手来说,弄懂这个模块就能学到MITK中非常非常重要的一部分内容:状态机和交互。
mitk::ToolManager
MITK自带很多分割小工具,比如我们在插件中看到的AddContourTool, SubtractContourTool等等mitk::SegTool2D,这些都继承自mitk::Tool。这些2D tool,当然还有没提到的3D tool都由mitk::ToolManager来管理。ToolManager确保一次只有一个tool可以接收到MITK的事件。选择各种tool的GUI是QmitkToolSelectionBox。
mitk::ToolManager 内能够存储一组待分割数据(reference data),和一组分割数据(working data)。 mitk::tool类型的对象可以由ToolManager的方法GetToolById(int id)获得,而且也可以获得相关的reference data and working data. 用户可以通过两个工具(QmitkToolReferanceDataSelectionBox和QmitkToolWorkingDataSelectionBox)修改reference data 和working data。
QmitkToolSelectionBox和ToolManager的关系
QmitkToolSelectionBox相当于是toolmanager的GUI,为什么这么说呢?QmitkToolSelectionBox继承了QWidget,负责以图形化的方式显示toolmanager管理的tools,以及这些tool的状态(即目前哪个tool已被选中)。通常,当QmitkToolSelectionBox被设为enabled或disabled,这些tools也会被enabled或disabled。

mitk::ToolManagerProvider
一个宏服务单例模式,用于获得mitk::ToolManager的实例。注意:单例模式保证一个类有且只有一个实例,并提供一个访问它的全局访问点。
它只能由SegmentationModuleActivator实例化。通常,获得一个toolManager的方法是:
mitk::ToolManager* toolManager =mitk::ToolManagerProvider::GetInstance()->GetToolManager();

mitk::Tool
每个分割工具类(tools)都继承自mitk::Tool,且有对应的ID和图标。其实,真正的分割方法主要写在mitk::SegTool2D里面。每个tool都应该能够处理交互,比如创建种子点,画轮廓等,以便为分割算法提供参数。有的简单的分割算法甚至集成在了tool中。
tools都是非图形化的类,也就是没有GUI。它们只实现renderwindows中的交互。但是一些工具可能需要用户先指定一些参数,这就要通过GUI完成。tool GUI继承自QmitkToolGUI。tool通过消息将状态变化传递给它们的GUI;tool GUI通过直接调用相应tool的方法完成对tool的通信。示例可参考mitk::BinaryThresholdTool。
slice的提取和替换
Slice处理。3D volume中slice的处理主要由两个filter完成。mitk::ExtractImageFilter从3D Volume中提取一个2D slice。mitk::OverwriteSliceImageFilter可以将3D volume中的一个slice用另一个slice替换。大多数分割工具都使用这两个filter完成在3D volume中画轮廓的工作。
未分割slice的插值
未被分割的slice可以通过插值来完成分割工作。mitk::SegmentationInterpolationController可以扫描一个mitk::Image对象,寻找带有非零像素的slice。它持续跟踪图像中的变化,并能知道一个slice的哪些相邻slice被分割了。QmitkSlicesInterpolator负责GUI,可以开启或者关闭插值,还可以选择是对一个slice还是所有slice进行插值。
问题是QmitkSlicesInterpolator和mitk::SegmentationInterpolationController之间是怎么合作的?
Undo撤销
Undo函数在 mitk::OverwriteSliceImageFilter中实现,这是因为所有的图像更改都在该类中完成。
GUI
最顶层的GUI类是QmitkSegmentationView

医疗技术

13636600011 发表于 2016-4-22 17:00:42

谢谢大神

proton 发表于 2016-5-9 21:35:41

谢谢楼主分享,收藏

13636600011 发表于 2016-5-18 20:51:00

好好好好哈

medimagedev 发表于 2016-5-19 14:15:15

好贴,不要沉了

medimagedev 发表于 2016-5-22 16:36:10

谢谢楼主!

13636600141 发表于 2016-5-23 04:42:31

顶 顶 顶 顶 顶 顶 顶 顶

medphysics 发表于 2016-5-23 08:15:44

看看是不是很实用

ultrasound 发表于 2016-5-26 22:11:21

谢谢LZ

mdeimage 发表于 2016-7-1 05:49:41

谢谢楼主分享,收藏
页: [1] 2
查看完整版本: MITK分割模块之ToolManager