1. 引言
可视化是上世纪80年代由国外提出的一种用图形图像表现看不见、摸不着的大量数据中规律的一种方法,是继实验、理论推导后,又一重要科学规律发现的方法 [1] [2] 。
传统的可视化技术关注和解决的问题是将现有数据通过何种形式和何种方式表现出来,但在某些场合下,仅仅有这样的表现是不够的,我们可能需要同一份数据在不同条件下表现出不同的形态,也可能需要将数据和图形的变化都能够实时反映出来,或者我们不满足现有的数据,需要对它做一定的改造,同时对于数据的改造过程也需要实时表现,我们称这一种表现方式为数据的“智能表现”。为此,我们提出了具有普适意义的基于二叉树结构的柔性动态可视化技术(Flexible dynamic visualization technology) [3] - [7] ,该技术将柔性化、动态设计思想率先引入到可视化对象处理过程中,把传统的可视化技术与柔性化动态思想有机结合起来,并贯穿此新技术于可视化对象动态处理全过程,从而更灵活、更好地表现客观事务。该技术填补了可视化技术领域的空白,丰富了可视化技术领域的理论与实践,其特色正如名称所示,有两个,一个是柔性数据的构造,另一个是用图形动态显示规律过程。柔性数据的构造是针对用户的不同数据的构造需要提出的,是前期用户的不同数据的需要产生的前端数据柔性构造技术,不是数据的后期柔性处理。第二个特色动态,指用图形动态展示数据中隐含规律的形象直观方法。
我们首先将该项技术成功应用于计算机科学教学过程中,取得了较好应用效果 [8] [9] [10] 。之后,我们成功将该项技术应用于医学领域,以扩大其应用范围。本文正是在这种医学应用需求下,取得的一项探索性阶段成果。
2. 柔性动态可视化技术简介
柔性动态可视化技术主要内容如下:
1) 柔性动态可视化技术模型
用计算机进行对象处理,大致要经过建模、处理、结果输出三个过程,而建模是首先必须要解决好的问题。要实现对象的柔性动态可视化处理,同样要选择、确定一个适合柔性动态可视化的模型。经过对大量计算机处理对象的分析、研究,我们发现,实际的对象常常可以抽象为数组、队列、树、森林、图及表格。图与森林相对应,森林可以转化为树,一般树可以转化为二叉树;数组与队列相对应,数组与二叉树又可以对应起来。由此看来,二叉树是整个数据结构中的核心。对于二叉树的柔性可视化处理就是整个对象柔性动态可视化处理的关键所在。为此,我们提出以二叉树结构为核心的二层次柔性动态可视化技术模型(见图1),从柔性可视化构造二叉树,完成模型间转换,最终完成柔性、动态显示处理对象过程。
![](//html.hanspub.org/file/4-2610094x9_hanspub.png)
Figure 1. The theory model of the two layer flexible dynamic visualization based on the structure of the binary tree
图1. 基于二叉树结构的二层柔性动态可视化技术理论模型
在我们提出的基于二叉树结构的二层柔性动态可视化技术模型中,二叉树与处理对象的互换是该模型中重要的一个环节,也是重要的一个内容。对于一些看似与二叉树没有关系的对象,我们总能将它们对应起来。对应的办法可以有很多,比如,双方均线性化之后就可实现一一对应,当然,线性化只是一种对应方法,我们完全可以根据实际对象的特性、不同需要,找到适合的对应方法。
2) 关键技术
从整体看,该项技术涉及三个重要关键技术,它们是数据的柔性构造、数据模型层内部各数据模型之间的转换及处理结果的柔性动态展示。
① 数据的柔性构造
数据的柔性构造是根据处理对象实际不同需要,进行处理对象所需数据的不同阶段的柔性化构造过程。柔性动态可视化的数据来源有两个,一个是从其它数据模型中进行抽取、转化,另一个是用户依据处理对象需要自主构造。无论通过哪一种方式进行数据构造,都可能出现构造的数据不能完全符合处理对象实际需求的情况,此时,就需要对已构造的数据进行一定的改造和处理,使之更加切合处理对象的实际需求。为此,在数据的柔性动态可视化处理过程中,我们首先需要对二叉树核心数据模型进行柔性构造。在后期展示中,还可能需要对参与展示数据(含图像数据)进行柔性微调。
② 数据模型层内各数据模型之间的转换
数据模型层是我们为了将数据模型之间的转换和柔性构造作为一个单独的问题进行集中处理而提出来的。根据我们提出的以二叉树模型为核心的柔性动态可视化技术二层理论模型,在数据模型层内部,可完成从二叉树核心数据模型与其它数据模型进行转换任务,并且在转换前后柔性调整数据模型中的数据。
③ 处理结果的柔性动态展示
动态展示是对处理对象的处理结果的实时动态形象化的展示过程,是揭示处理对象本质规律的重要一环,为此,我们需要结合处理对象的实际需求设计自己的形象化展示方式。在展示过程中,可能会出现一些不尽如人意,甚至不恰当的方面,此时,就需要对数据(含图像数据)再次进行柔性化处理,从而修正处理过程中发现的不当数据,更好满足处理对象需求。
3. 柔性动态可视化技术的潜在应用领域
我们将自主研发的“柔性动态可视化技术与普适应用系统V1.0”应用于我校计算机专业三门课程的二叉树、单向链表、层次结构图、背包问题等四个代表性模块教学应用实践中,已取得了巨大成功。老师们在教学上更加省心省力;学生们反映柔性动态可视化教学系统让原本晦涩难懂的教学内容更清晰易懂,理解更深刻,记忆更牢固。近年来,我们将柔性动态可视化技术成功应用于医学领域,以扩大其应用范围,下一步我们还计划将这一技术推广、应用于地质勘探、气象学、分子模型构造、计算流体力学和有限元分析等领域。
4. 柔性动态可视化技术与普适应用系统
4.1. 项目实现原理
近年来,针对医学领域需要,我们成功研发了“三维医学图像可视化系统”。在此基础上,我们把这个原型系统也作为一个我们这项新技术应用的一个处理对象,将我们提出的柔性动态可视化技术创新运用于医学领域。具体来讲,我们对自我研发的“柔性动态可视化技术平台”进行整合、提升,形成“柔性动态可视化技术与普适应用系统”平台,通过“柔性动态可视化技术与普适应用系统”来启动原有的“三维医学图像可视化系统”,把“三维医学图像可视化系统”的图像数据作为“柔性动态可视化技术与普适应用系统”的输入数据,借助柔性动态可视化思想,我们通过柔性建立二叉树数据模型,通过跨进程的共享使两个系统操作同一片显示缓冲区,从而达到在“柔性动态可视化技术与普适应用系统”中通过操作二叉树核心数据模型来精确定位并调整医学图像上任意一个像素点的色彩、灰度等信息,使医学图像得到修复,这一点对于医生准确确定患者病灶是具有积极意义的,对一般位图的处理也同样有效、适用。
4.2. 项目设计方案
1) 跨平台启动、运行
跨平台启动就是以“柔性动态可视化技术与普适应用系统”平台中启动并运行其他软件的过程。
2) 图像数据获取
获取图像数据就是采取任意大小矩形框形式对图像数据进行采集、保存的过程。我们所采集的数据最好是特征性比较强,这样在完成图像的修改之后,我们可以比较容易的比较出修改之后的图像与原来采集的图像之间的差异性;并且,我们所采集的图像的范围也要较为合适,否则,会导致产生的数据过多,以至于在柔性构造平台中显示时,给我们在修改数据和观察数据方面带来不便。
3) 数据导入
数据导入就是对图像数据在“柔性动态可视化技术与普适应用系统”平台中以另一种方式呈现的过程。我们以可视化的方式将图像数据在“柔性动态可视化技术与普适应用系统”平台中以二叉树的形式构造出来,以便于我们对图像数据进行调整。通过该模块我们将“柔性动态可视化技术与普适应用系统”和“三维医学图像可视化系统”实现了无缝衔接,验证了“柔性动态可视化技术与普适应用系统”的普适性。
4) 数据调整
利用已有柔性构造平台对取得数据进行必要调整。我们可以在该平台中将图像数据调整为我们需要的数据,以实现我们预期的目标,其中包括了对图像数据的修改、删除等操作。
5) 图像修复
在医学图像平台中观察医学图像因数据调整变化效果,以此验证柔性动态可视化技术在医学图像上的应用情况。在医学图像平台中我们将修改后的图像数据显示在医学图像平台中,同时,我们可以将修改后的图像与之前采集的图像做对比,观察调整之后的效果,最终完成图像修复。
4.3. 系统主要功能实现
1) 导入数据并生成二叉树
我们通过采取任意大小矩形框形式对图像数据进行采集,并将取得的数据按照从上到下、从左到右的方式依次写入“color”文件中,然后将这些数据以可视化的方式在“柔性动态可视化技术与普适应用系统”平台中以二叉树的形式构造出来,之后就可以对构造出的二叉树进行柔性、动态调整。以下为导入数据并生成二叉树的核心代码:
void CSubjectDemoDoc::OnShowTree()
{
STR_LIST strlinlist;
STR_LIST::iterator strpoint;
//读入文件 数字数组的文件
CFileDialog dlg(TRUEtxt,OFN_HIDEREADONLY,_T(Text Files (*.txt)|*.txt|All Files (*.*)|*.*||));
int nID=dlg.DoModal ();
if(nID != IDOK)return ;
m_tncTreeNodeChain.DeleteTree();
m_ElementList.RemoveAll();
CString filePath=dlg.GetPathName ();
CString szLine =
int _strarry[] = {0};
CStdioFile file;
file.Open(filePath,CFile::modeRead);
Btree A;
int _id = 0;
if( file.ReadString( szLine ) )
{
char *buf=szLine.GetBuffer(0);
char* token = strtok( buf);
while( TRUE )
{
if(token == NULL)
break;
A.create_Btree(atol(token),_id);
token = strtok( NULL);
}
}
file.Close();
A.Preorder(A.root,&strlinlist,0);
for (strpoint = strlinlist.begin(); strpoint != strlinlist.end(); ++strpoint)
{
szLine = *strpoint;
ReadinitData(szLine);
}
for (strpoint = strlinlist.begin(); strpoint != strlinlist.end(); ++strpoint)
{
szLine = *strpoint;
ReadiniLine(szLine);
}
this->UpdateAllViews(NULL,0,0);
}
2) 将修改后的数据传回到三维医学图像系统并显示
我们对导入的数据进行必要的调整之后,可以将修改好的数据再次保存至“color”文件中,通过三维医学平台将修改过的图像数据以可视化的方式显示出来,观察调整之后的效果,最终完成图像修复,达到预期目的。以下为将修改后的数据传回到三维医学图像系统并显示的核心代码:
void CMy3DShowImageView::Oncorrectimage()
{
CWindowDC dc(this);
char buff[100];
FILE *fp = fopen(colors.txtr+);
fgets(buff, sizeof(buff), fp);
unsigned int m = point2.x - point1.x;
unsigned int n = point2.y - point1.y;
int i = 0;
while((fscanf(fp%lu,buff[i])) != EOF)
{
i++;
}
for(int i3 = 0; i3 < m; i3++)
{
for(int i4 = 0; i4 < n; i4++)
{
dc.SetPixel(i3+600,i4+20,*(buff+((i3*n) + i4)));
}
}//end for]
MessageBox(succeed! hh);
}
5. 实验结果及结论
通过“添加功能”模块跨平台启动我们多年研发的“三维医学图像可视化系统(V2.0)”,对医学图像系统展现的图像数据进行获取,将取得的数据传回柔性动态可视化与普适应用系统的柔性动态构造平台,在柔性动态构造平台中对取得数据进行必要调整,最后观察三维医学图像可视化系统平台下因数据调整带来的图像变化情况。图2-图6给出了柔性动态可视化技术在三维医学图像修复上的应用情况。
本文基于我们研发的“柔性动态可视化技术与普适应用系统V1.0”、“三维医学图像可视化系统V2.0”两大系统,研究了柔性动态可视化技术在医学领域中的图像修复应用情况。实验结果表明,柔性动态可视化技术在三维医学图像中的应用是完全可行的,可以实现三维医学图像的图像修复,并且可以将其应用到一般的位图领域当中。我们希望,该系统在以后的改进版本中,能做到对数据的更科学、更智能的获取,并使该技术得到更进一步、更宽广的应用。
![](//html.hanspub.org/file/4-2610094x10_hanspub.png)
Figure 2. 3D medical image visualization system
图2. 跨平台启动三维医学图像可视化系统
![](//html.hanspub.org/file/4-2610094x11_hanspub.png)
Figure 3. Interception of 3D medical image
图3. 三维医学图像的截取
![](//html.hanspub.org/file/4-2610094x12_hanspub.png)
Figure 4. 3D medical image data of the binary tree display
图4. 三维医学图像数据的二叉树显示
![](//html.hanspub.org/file/4-2610094x13_hanspub.png)
Figure 5. Modification of 3D medical image data
图5. 三维医学图像数据的修改
基金项目
陕西省教育厅科研专项(16JK1163)、陕西理工大学科研基金(基金号SLGQD0903)。