面向教学的可视化图像处理编程语言设计

时间:2022-10-06 01:55:06

面向教学的可视化图像处理编程语言设计

摘 要: 针对学生对《数字图像处理》课程内容感到抽象,对编程存在一定畏难情绪的状况,提出利用可视化编程来提高学生对数字图像处理实践的参与程度。为此设计了一种基于XML的图像处理可视化编程语言,为图像处理任务的可视化编程打下了基础。语言定义了图像处理功能模块和程序的结构,以包含可视化实现图像处理流程的必要信息;给出了针对该语言的翻译器的基本原理与关键步骤,能将可视化程序翻译为m文件,从而能在MATLAB环境中执行。基于所设计的语言和翻译器能够实现可视化图像处理程序设计软件,并可引入不同难度层次的图像处理编程训练,有助于学生掌握和运用《数字图像处理》课程的相关方法和技术。

关键词: 数字图像处理;可视化编程;XML;MATLAB

中图分类号: G434 文献标志码:A 文章编号:1673-8454(2017)08-0093-04

一、可视化图像处理编程语言的设计目的

《数字图像处理》是电子信息类专业一门重要的专业课,因其与机器视觉具有密切关系,在我国制造业升级的大环境下,该课程的教学更具有了重要的意义。《数字图像处理》实践性强,因此针对本课程的演示实验和学生动手的课程实验,已经有许多研究者基于诸如Visual C++[1]、OpenCV[2,3]、ImageJ[4]、DSP[5,6]以及MATLAB[7-9]等不同软件和技术提出了实验教学的方案。但从学生实际情况来看,若仅提供操作界面,通过菜单和按钮操作来观察图像处理方法的效果,虽然能适应多数学生的水平,也能帮助直观了解有关方法的效果,但对方法的编程实现训练不足;但若使用某种编程语言来进行实验,哪怕是使用OpenCV或MATLAB@类直接支持图像处理的语言,仍会使相当部分的学生产生畏难情绪,且在实现过程中易于陷入语言本身的细节问题,难以专注于对特定图像处理应用的整体框架性理解。

在多年的教学过程中,学生普遍对可视化的编程工具表现出新奇感,较少产生畏难情绪,实验的参与度普遍较高。除此之外,可视化编程本身的框图特性,能够直观便捷地描述出算法的主要步骤和流程。因此,本文设计了一种MATLAB环境下用于数字图像处理的可视化编程语言xGIPL(XML-based Graphical Image Processing Language),它将相关实现代码封装为图像处理“功能模块”,使学生可以将注意力集中在整体算法步骤的理解上,而不用担心语言细节。基于该语言,可以开发面向图像处理的可视化编程软件,其用户界面和操作类似于Simulink,即通过图形化模块设计界面或直接书写所需要的XML模块文件,来预先实现好所需的图像处理步骤的功能,如图像的二值化、颜色空间转换、常用的滤波操作、区域标记和特征提取等等,然后由用户在可视化编程界面中通过拖放、删除、连接模块以及图形化的设置模块参数等操作,实现完整的图像处理任务的编程,之后可视化编程软件将负责分析和解释所实现的图形化程序,将其翻译为MATLAB m文件函数,并自动在MATLAB执行程序和返回处理结果。

二、图像处理功能模块的设计

图像处理功能模块(Image Processing Module,IPM)是具有输入和输出、完成特定图像处理步骤的基本编程单元。在可视化编程界面中,每个IPM就是一个可独立增减、拖拽并能够与程序的其他部分通过连线相连接的实体。IPM的定义由IPM文件给出。我们用XML语言来定义模块,因为XML语言本身具有灵活性和易读性,能够自由地定义所需的内容;XML的编辑很方便,通过普通的文本编辑器即可进行;此外在很多开发环境中,都有现成的XML解析器可用,从而大大方便了IPM和可视化图像处理程序的翻译过程。

1.IPM的具体设计

每个IPM的XML结构中包含一个名为“ipmod”的根节点,其下包含如下子节点:①mod_name节点。给出了每个IPM在模块库中的全局唯一的标识,且与IPM的XML文件名相同;②mod_help节点。提供了本IPM的帮助信息,可在可视化编程界面中为用户提供模块的用法;③glyph节点。用于指定一个图片文件路径,以便在可视化编程界面中提供更加直观和美观的模块外观;④parent_group节点。用于以树状结构组织和管理众多IPM构成的模块库;⑤port_pos节点。用于指定可视化界面中IPM的输入输出端口出现的位置。port_pos又包含两个子节点:inport_pos节点和outport_pos节点,分别指定了输入端口和输出端口的位置;⑥inputs节点和outputs节点。分别用于定义与IPM的输入和输出有关的信息。在inputs节点和outputs节点之下,又分别可包含一个或多个inport节点和outport节点,它们具体定义了每个输入端口和输出端口,其结构稍后介绍。inputs节点和outputs节点为可选节点,即一个IPM可以没有输入(没有inputs节点)或没有输出(没有outputs节点),但不能两者均无;⑦implement节点。给出了实现本IPM的处理功能的MATLAB代码。

inputs节点下的inport节点及outputs节点下的outport节点定义了IPM的各输入、输出端口,相当于IPM的输入和输出参数。inport节点和outport节点均包含如下子节点:

(1)port_name节点。给出了该端口在IPM内的唯一名称,并且在IPM的implement代码中通过“%port_name”的方式加以引用。

(2)port_help节点。给出了该端口的帮文本。

此外,inport节点还包含:

(3)可选的value_range节点。当一个inport节点包含value_range节点时,表示该端口的取值有一定的范围限制,因此在可视化界面中可以采用适当的方式(如滚动条或下拉菜单等)更方便地加以设定。输入端口的取值范围又可采用如下三种形式之一:①整数取值范围。用value_range节点下的int_range子节点表示,而int_range下又含一个max子节点和一个min子节点,分别给出可选的整数值的上下限;②实数取值范围。用real_range子节点表示,其下同样包含一个max和一个min子节点来给出上下限;③类别型取值范围。用cat_set字节点表示,其下包含若干cat子节点,每个cat子节点的值一般为一个MATLAB字符串。

(4)可选的default节点。表明当该输入端口未与其他模块的输出端口相连,也没有通过用户编辑来设置一个值时,该端口的缺省取值。若存在default节点,则表明该输入是可选参数,否则输入是必选参数,必须由用户通过上述两种方式之一为其提供所需的值。

2.IPM示例

下面以一个示例性的ReadImage IPM的XML文件来说明所定义的结构。ReadImage模块定义的代码如下,为简洁起见,其中略去了mod_help、glyph、port_pos、parent_group和port_help等非核心节点:

ReadImage

Path

Format

'Auto-determined'

'bmp'

'jpeg'

...

'Auto-determined'

ImageData

if strcmp(%Format, 'Auto-determined')

%ImageData = imread(%Path);

else

%ImageData = imread(%Path, %Format);

end

由上述代a可见,ReadImage模块包含两个输入端口――Path端口和Format端口。Path端口用于指定待读取的图像文件的路径,是必选端口,需要用户在可视化编程的模块编辑界面中输入或通过其他模块传入;Format端口用于指定图像文件的格式,具有类别型的取值范围,指出了模块支持的图像文件格式,而缺省值为“Auto-determined”,即模块根据文件后缀名自动确定图像文件格式。输出端口只有一个,即ImageData端口,是所读取到的图像数据矩阵。在implement节点中可以看到模块功能的实现代码。

三、可视化图像处理程序的结构设计

1.图像处理程序的设计

在可视化编程界面上放置、拖拽和连接IPM的实例,即可构成图像处理程序(Image Processing Program,IPP)。我们同样利用XML来作为程序源代码的组织方式。图像处理程序的XML根节点是“ipprog”节点,其下包括1个memo节点和若干个block节点。memo节点仅是对IPP的描述和介绍,而构成IPP实质功能的部分是block节点。

block节点包含如下子节点:

(1)block_name节点。block_name是程序中每个IPM实例在IPP范围内的唯一标识。一个IPM可能在一个IPP中有多个实例,但这些实例必须具有不同的block_name。

(2)module节点。储存了该IPM实例所使用的IPM的名字,即IPM定义中的mod_name。

(3)inputs节点。储存了该IPM实例的输入值的信息。inputs节点下包含一个或多个inport节点,每个inport节点描述了相应的输入端口的输入值信息,由如下子节点构成:①port_name节点。输入端口的端口名,即IPM定义中的port_name;②value_type节点。value_type节点的可能取值为“internal”或“external”。internal表示该端口的输入值是由用户在模块编辑界面中输入而来,并非来自其他IPM实例的输出;external则表示该端口的输入值由其他IPM实例的输出所提供;③value节点。当value_type为internal时,用户提供的输入值储存于value节点中;当value_type为external时,则不应出现value节点;④src_block节点和src_outport节点。当value_type为external时,src_block节点储存了该输入端口的输入所来自的那个IPM实例的名字,即前述的block_name;src_outport节点指出了所来自的该IPM实例的具体输出端口名。通过src_block和src_outport便隐含地描述了IPM间的连接情况。当value_type为internal时,不应出现src_block和src_outport节点。

2.IPP示例

我们通过如下示例IPP来进行说明:

This is an examplar application diagram.

writer

SaveImage

ImageIn

external

reader

ImageData

Path

internal

'result.jpg'

Format

internal

'Auto-determined'

reader

ReadImage

Path

internal

'image1.jpg'

Format

internal

'Auto-determined'

@个简单的程序包括两个IPM实例:reader和writer。reader模块是一个ReadImage IPM,在程序的输入设置下由“image.jpg”文件读入图像;writer模块是一个SaveImage IPM,在程序的输出设置下将reader读入的图像数据再保存为图像文件“result.jpg”。

四、可视化图像处理程序翻译器

可视化图像处理程序翻译器的作用,是将IPP自动转为可在MATLAB中执行的.m函数文件。翻译器的基本工作思路是首先对IPM和IPP的XML文件进行解析,获取各个XML节点信息,然后以系统性的编码和命名方式来产生所需的.m文件。

在完成XML文件解析后,先根据程序所用各IPM的implement元素,以子函数形式封装这些代码。封装的主要思路是,利用IPM名作为子函数名,采用系统性的方法定义输入输出的变量名,例如对于第1个输入,可以定义为“in1__”。在定义了输入输出的变量名后,将implement代码中以%port_name形式给出的输入输出变量替换为所生成的变量名。

整个IPP的翻译则首先需要对IPM实例按调用的逻辑顺序进行排序。程序要能够执行,要求每个IPM实例(所对应的子函数)在被调用前,其输入都已确定。因此我们需要对IPM实例排序。考虑到IPM实例数量通常不大,我们重复地遍历这些IPM实例,并对它们进行标号。开始时,所有IPM实例的标号均为0。如果一个IPM实例的某个输入端口的value_type为internal,或者该端口为external,但与其连接的src_block IPM实例已经被标号,那么这个输入端口的值就已经确定;如果一个IPM实例没有输入端口,或者所有输入端口的值均已确定,那么就用一个大于0的整数值标号该IPM实例。当所有IPM实例均被标号,或者在一次遍历中没有IPM实例被标号,那么整个排序过程即告完成。

之后,按标号由小到大的顺序将每个IPM实例转为对相应子函数的调用代码,并采用系统性的方法来命名IPM实例的输入输出端口对应的变量,最后以程序文件名作为函数名,为翻译好的代码加上MATLAB函数定义头,并保存为同名的.m文件,便完成了翻译。

例如,经过翻译之后,由第二节中示例IPM所得的子函数以及第三节中示例IPP对该子函数进行调用的MATLAB代码如下:

function example()

reader_Path_in__ = 'image1.jpg';

Reader_Format_in__ = 'Auto-determined';

[reader_ImageData_out__] = ReadImage

(reader_Path_in__,reader_Format_in__);

function [out1__] = ReadImage(in1__, in2__)

if strcmp(in2__, 'Auto-determined')

out1__ = imread(in1__);

else

out1__ = imread(in1__, in2__);

end

五、开展图像处理编程训练的若干层次

利用本文所设计的xGIPL可视化图像处理编程语言,可以开展不同层次的图像处理编程训练。我们目前所能考虑到的就至少包括以下三个层次:

(1)使用xGIPL在已有模块的基础上进行可视化编程。学生通过使用现成的IPM来进行可视化编程,能够了解和掌握解决特定图像处理任务的整体性思路,并能够直观地感受处理的效果以及程序的性能。这一层次属于较低的训练层次。

(2)通过MATLAB编程来自行实现关键的IPM,并通过可视化编程完成应用的完整实现。在该训练层次下,学生应对MATLAB语言编程有相当程度地掌握,并且也能够完成IPM的设计,从而能够针对特定的图像处理问题自行实现其中的关键步骤,并完成IPM的封装。这一层次属于中等训练层次,能够锻炼学生对MATLAB这一高级编程语言的运用。

(3)通过MATLAB的C/C++ MEX编程来实现关键的、对于计算性能有较高要求的图像处理功能,从而能够更高效地完成整个图像处理任务。这一训练层次要求学生不但熟悉xGIPL和MATLAB语言,而且也熟悉C/C++编程,并且能够使用C/C++语言进行图像处理算法的低层级编程,因此属于最高的训练层次。

参考文献:

[1]翁花群,林元国.基于Visual C++的数字图像处理实验教学软件开发[J].廊坊师范学院学报(自然科学版),2015(1):24-28.

[2]李志欣,卓亚琦.基于OpenCV的数字图像处理实验教学研究[J].大学教育,2013(9):42-43.

[3]张帆.基于OpenCV实践项目的数字图像处理教学方法探索[J].亚太教育,2015(22):133.

[4]郑林涛,董永生.ImageJ软件在数字图像处理课程教学中的应用[J].中国电力教育,2014(8):112-113.

[5]施帮利,韩武红,杨奕.基于DSP的数字图像基本处理实验教学探讨[J].中国电力教育,2013(10):171-173.

[6]鲁亿方,蓝金辉,迟健男.基于DSP的数字图像处理实验的探究[J].实验技术与管理,2014(3):109-113.

[7]邱广萍.MATLABGUIDE在数字图像处理教学中的应用[J].价值工程,2014(3):184,186.

[8]赵敏.MATLAB用于数字图像处理的教学实践研究[J].电脑知识与技术,2012(31):7539-7540.

[9]肖龙飞,李金龙,杨凯,etal.基于MATLAB的数字图像处理教学软件的设计[J].信息技术,2014(12):185-187.

上一篇:后路腰椎椎体间融合术与经椎间孔入路腰椎椎体... 下一篇:炎琥宁联合干扰素雾化吸入治疗小儿疱疹性咽峡...