shartoo +

医疗软件Mevislab使用

本文总阅读量
欢迎star我的博客

前言

在阅读肺结节CT图像处理的相关论文时,注意到很多作者都使用的是一款软件Mevislab。Mevislab是一款用于图像处理,尤其是医疗CT图像领域的,快速原型开发平台,做学术研究和个人学习是免费自由使用的(可自由开发的模块有限), 商业环境下使用时收费的。我曾发邮件咨询过,大概每年2万2(2017年3月份)。下图是工作台样例:

mevislab工作台

官网地址:Mevislab

论坛地址:Mevislab论坛 ,很多问题自这里可以咨询,论坛活跃用户不多,一般可能要隔两天才有人回,可能是时差。

一 特点

二 使用

2.1 基本使用

首先,构建一个最基本的图像处理流程

基本流程

其中ImageLoad,Threshold,SoView2D这三个模块可以在任务栏的module中搜索找到,或者直接搜索框里输入即可得到。我们可以在图中看到不同的module有不同的颜色,接口处的形状也不同,有尖三角,有半圆形,它们代表不同的意义。具体的请参考官方文档,本文重点不讨论这个。

常规的图像处理流程包括,载入图像,处理算法,展现模块。其中载入图像模块如上图ImageLoad,可以载入普通JPEG

2.2 基本模块

模块类型

类型 外形 特征
ML模块(蓝色) ML module 基于分页的,命令驱动的体素处理
开放的素材模块(可以用来组合和协助构建处理过程)(绿色) inventor module 视觉场景图(3D),名称转换,所有模块以So(scene object)开头
宏模块(棕色) macro 组合其他模块类型,允许层次继承和脚本交互

连接器

外观 形状 定义
三角形 三角形 ML 图像
半圆形 半圆形 场景素材
方形 方形 基本对象:指向数据结构的指针

链接

类型 外观 特征
数据链接(连接器链接) 数据链接 连接器之间的直接链接。不同的连接器会有不同的颜色,蓝色的为ML,绿色的为开放素材,棕色的为基本类型
参数链接(域链接) 参数链接 模块之间或模块内部的参数的链接形成的链接

三 实现一个轮廓过滤

假设我们的轮廓过滤步骤为: 载入图像a–>均值化[b]–>形态学膨胀操作[c]–>求差值[b,c]–>查看图像

在Mevislab的工作台新建网络,并载入模块LoadImage,Convolution,Morphology,Arithmetic2。这些模块可以直接在搜索框搜索到。将这些模块按照如下图连接起来,连接操作鼠标左键点击模块的连接点,然后拖到下一个模块,松开即可。

网络流程

参数调整

调整参数时,双击模块面板,有些隐含的参数需要右击面板–>show autopanel。如果想让模块A中的参数param_a赋值给模块B中的参数param_b,在A面板中点击param_a拖住(可以看到此时面板中的param_a处出现了一个蓝色的箭头),拉到面板B中的参数param_b处(也看到蓝色箭头激活)。如何保持参数同步(模块之间参数赋值),示例如下:

模块间参数同步

其他参数设置参考下图:

模块间参数同步

四 图像操作和处理

4.1 图像操作

4.2 图像属性

4.3 基本图像处理

4.4 过滤器

4.5 分割

4.6 可视化

2D可视化

3D 视图

4.7 LookUp Table

此模块用于编辑网络中其他模块的参数(此模块后续再补充,没怎么用)

4. 8 Markers

4.9 Curves

4.10 Contours

4.10 Surface objects

五 创建 Open Inventor Scene

此模块主要利用Mevislab提供的各种自木块来构建各类视图模型,Open Inventor是一个面向对象的3D开发工具。Inventor scenes以场景图的形式组织。一个场景图由代表即将绘制的3D对象的节点,3D对象的属性,与其他节点结合的节点组成层次树,其他如摄像机、灯光等组成。

注意Open Inventor中的遍历路径如下,这对于如何构建场景图很关键。

遍历路径

Open Inventor模块的函数有:

注意:在ML模块中模块的域值更新是同步的,但是在Open Inventor中是异步的,更改值之后会先存储在延迟队列中。

关于如何构建这些场景,示例图如下:

遍历路径

遍历路径

你可以将Mevislab当做一个3D建模工具玩。

六 构建宏模块

宏模块可以通过MDL(Mevislab Definition Lanague)和python或JavaScript脚本实现。宏的功能与其他模块类似,可以理解为一系列完成某种功能的模块的集合被封装成了一个模块。

构建一个宏模块,你需要走如下三步。

6.1 构建宏

首先,你得把一系列用于完成特定任务的模块串起来定义好,放入工作台。如下图:

宏定义模块

定义好之后将网络存储在某个位置,比如命名为test_macro.mlab。

然后选择FileProject Wizard 并选择 Macro。然后设置宏的一些参数,其中打星号的是必须的。

宏定义模块

然后下一步,选择Network File name时选择刚保存test_macro.mlab。点击创建之后会自动创建如下文件

宏定义模块

此时,即可在搜索栏搜到刚刚定义的宏模块。

6.2 给宏添加宏参数和面板

右键点击刚刚创建的宏的面板选择related files,选择mevislab_macro.script编辑此脚本。此脚本包含了区域:

参考示例:

Interface {
Inputs = ""
Outputs {
Field Scene { internalName = "Applicator.self" }
}
Parameters {
Field length {
type = float
value = 20
min = 1
max = 50
}
Field diameter {
type = float
value = 3
min = 0.1
max = 10
}
}
}
Commands {
source = $(LOCAL)/test_macro.py
FieldListener length { command = AdjustLength }
FieldListener diameter { command = AdjustDiameter }
}
Window {
Category {
Field length { step = 1 }
Field diameter { step = 0.1 }
}
}
下图为定义之后的面板效果


 ![宏定义模块](/images/blog/mevislab_macro4.jpg)

6.3 python脚本

上一步的scipt脚本中,Command所使用的test_macro.py需要编写。示例如下:

# -----------------------------------------------------------------------------
## This file implements scripting functions for the ApplicatorMacro module
#
# \file ApplicatorMacro.py
# \author JDoe
# \date 01/2009
#
# -----------------------------------------------------------------------------
# MeVis module import
from mevis import *
def AdjustLength():
overallLength = ctx.field("length").value
tipLength = ctx.field("SoCone.height").value
shaftLength = overallLength - tipLength
ctx.field("SoCylinder.height").value = shaftLength
def AdjustDiameter():
        diameter = ctx.field ("diameter").value

注意观察,python脚本中如何调用和控制参数。其中的ctx是默认的上下文,它可以访问当前网络中任何其他模块的任何field。比如此处的SoCone.height,其中的SoCone是一个模块,height是该模块的一个field,如果它有其他实例名example_name,则使用example_name.height也可以直接访问。 此处通过ctx.field("SoCone.height").value访问值,而ctx.field("SoCylinder.height").value = shaftLength来改变值。

七 渲染

其实Mevislab用起来只是快速实现模型,但是无法用于生产环境,处理速度太慢。平常用它来做渲染还是不错的,做3D渲染几乎不逊色于一般的3D建模软件。

我的博客

观点

源码