董 延,黄志刚,2
(1.北京工商大学 材料与机械工程学院,北京 100048;2.北京工商大学 中国食品安全研究中心,北京 100048)
在科研过程中,许多文献资料中的数据是以曲线的形式给出的。在只有曲线图而没有数学表达式的情况下,如果想要获得曲线上某些点的坐标值,较原始的方法是在坐标纸上手工描点,这种方法比较耗时,且准确度取决于取点的多少与描点精度。后来随着计算机的发展,出现了一些专用图像处理软件,在这类软件中,通过在图像上手工取点,再用曲线拟合的方法将各点连接,以提取出原始曲线。但是这种方法的准确度会受到取点的位置、数量以及所选择的拟合算法的影响。
本文提出一种基于Matlab 的图像处理技术提取图像中的曲线的新方法。创新处是在提取的过程中使用了图像的形态学运算,使得本方法只需选择较少的点,就能够快速、准确地将图像中的曲线提取出来。同时克服了图像背景对曲线提取产生的干扰。
Matlab 中的数字图像是以矩阵形式表示的,这意味着其强大的矩阵运算能力用于图像处理非常有利,矩阵运算的语法对Matlab 中的数字图像同样适用。
MathWorks 公司针对不同领域的应用,推出了30 多个具有专门功能的工具箱。这些工具箱都是由该领域内的专家编写的,用户可直接对工具箱内的函数进行调用,而无需自己编写所用的专业基础程序。
Matlab 图像处理工具箱(Image Processing Toolbox)专为数字图像处理而开发。它提供了一套全方位的参照标准算法和图形工具,用于进行图像处理、分析、可视化和算法开发。可进行图像增强、图像去模糊、特征检测、降噪、图像分割、空间转换和图像配准。该工具箱中的许多功能支持多线程,可发挥多核和多处理器计算机的性能。
Matlab 图像处理工具箱函数包括: 图像显示函数、图像文件输入、输出函数、图像几何操作函数、图像像素值及统计函数、图像分析函数、图像增强函数、线性滤波函数、二维线性滤波器设计函数、图像变换函数、图像邻域及块操作函数、二值图像操作函数、基于区域的图像处理函数、颜色图操作函数、颜色空间转换函数、图像类型和类型转换函数,共15 类[1]。Matlab 图像处理工具箱支持四种图像类型。这四图像类型分别为RGB 图像、索引图像、灰度图像和二值图像。这四种类型可以用工具箱的类型转换函数相互转换。
(1) 彩色图像。Matlab 可处理的彩色图像包括RGB图像和索引图像。一幅RGB 图像在Matlab 中是一个M×N×3 的三维数组。前二维M 和N 分别为数组的行数和列数,第三维则表示R、G、B 三个分量的值。可以将这个三维数组看作三个M×N×1 的二维数组的叠加。这三个二维数组分别表示这幅图像各像素点的R、G、B分量,相同位置的元素对应同一像素。各分量的取值取决于数组的数据类型。例如,当数据类型是double 时,取值范围是[0,1];当数据类型是uint8 时,取值范围是[0,255]。索引图像在Matlab 中则由一个M×N 的数组和一个m×3 的数组共同表示,其中M 和m 不一定相等。M×N 数组中的每个元素对应图像中相同位置的像素,元素的值n 则指向m×3 数组中的第n 行,即该位置的像素的R、G、B 值分别由m×3 数组中的第n 行的三个值来确定。
(2) 灰度变换。灰度图像的每个像素只有一个灰度值,因此灰度图像是一个M×N 的二维数组。将彩色图像变换为灰度图像,方法是取彩色图像中每个像素的R、G、B 分量值的均值,做为该像素的灰度值。
Matlab 中将RGB 图像转换为灰度图像的语法是I=rgb2gray(RGB);将索引图像转换为灰度图像的语法是I=ind2gray(X,map)。
(3)二值变换。二值图像在Matlab 中也是一个M×N的二维数组,但其数据类型是logical,因此其元素只取0 或1。0 表示背景像素(黑色),1 表示前景像素(白色)。将灰度图像转换为二值图像的语法是BW=im2bw(I,level)。
(4)数字图像的形态学运算。图像的形态学运算是指:用具有一定形态的结构元素去量度和提取图像中的对应形状,以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形状特性,并除去不相干的结构。与本文所述方法相关的形态学运算有形态学细化和形态学重构。
形态学细化可将二值图像中无孔的连续对象细化为不间断的线,且保留对像原始的形状;将有孔的连续的对象缩小为环,且保留对像原始的形状。Matlab 语法是BW2=bwmorph(BW,’thin’,n)。
形态学重构包括两幅图像和一个结构元。一幅图像是标记,是变换的开始点;另一幅图像是模板,用于约束变换过程。[2]Matlab 语法是IM=imreconstruct(marker,mask)。
作为面向科学与工程计算的大型科技应用软件,Matlab 同样提供了一功能强大的用于编写图形用户界面的工具: 图形用户界面 (Graphical User Interface,GUI)。其界面(GUI)是由各种图形对象如窗口、光标、按键、菜单、文字说明等对象构成的一个用户界面。用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,可以使计算机产生某种动作或变化,如实现计算、绘图等[3]。
在该界面内,用户可以根据界面提示完成整个工程,却不必去了解工程内部是如何工作的。
Matlab 图形用户界面设计的第一步是对控件进行布局,这是通过对各种图形对象的操作来实现的。它的设计方法有两种: 编写程序和使用GUIDE。编写程序的方法要求使用者深入了解各种图形对象的特征、属性和操作;而使用GUIDE 则使用者通过鼠标就可以生成各种GUI 控件并改变它们的外观和位置。第二步是编制菜单、控件的回调函数,这是图形用户界面设计的重点。回调函数就是当程序接受到某个Windows 动作,如鼠标单击、键盘输入的时候,为所希望进行的操作所指定的函数。该函数是由主控程序调用的。主控程序对各种消息进行分析,排队和处理,最后去调用指定的回调函数。
图1 为基于Matlab GUI 所编写的曲线提取程序的主界面。点击右侧下方的 “打开图像” 按钮,将会弹出文件选择对话框,该对话框的形式和操作与Windows 的文件选择对话框相同,不再赘述。
现以某发动机外特性曲线图为例。打开图像后,该图像会如图1 显示在主界面左侧。该图像的背景较复杂(有颜色较深的坐标网格线),对于曲线的正确提取会产生干扰。对于这类图像,应用本文所述的方法可将曲线准确地提取出来。
下面就以图1 左侧所示的某发动机外特性曲线图为例,结合Matlab GUI 程序的使用方法说明曲线的提取过程。
图1 GUI 主界面Fig.1 The main interface of GUI
读入需要提取的原始图像后,首先是对图像进行灰度处理。包括灰度变换和灰度阈值的设定。点击主界面右侧下方的 “灰度转换” 按钮,程序会将原彩色图像转换为灰度图像。转换为灰度图像后,可对灰度阈值进行设置。主界面 (图1) 右侧的最上方是 “灰度图阈值调整” 面板。可以用两个滑动条调整灰度图的最小和最大阈值。所有灰度值小于最小阈值或大于最大阈值的像素将会被过滤掉。合理地调整阈值可以去掉图像中无关的部分。
在这幅图像中有两条曲线,而需要提取的是上方的曲线,如图2 所示。当灰度图阈值的最小和最大值分别被设定为48 和114 时,图像中的大部分干扰像素(如坐标网格线和下方的曲线)都被去掉或变淡了。
图2 灰度处理效果Fig.2 The effect of gray processing
下一步是将灰度图像变换为二值图像。在点击主界面右侧下方的 “二值转换” 按钮后,程序会完成三步操作: 第一步,将灰度图像转换为二值图像;第二步,将二值图像形态学细化;第三步,删除二值图所有的交叉。例如,曲线与背景坐标格相交叉处的像素将会被删除。因此,曲线在与坐标格相交的地方会断开。这是为后面的形态学重构做准备。
经过2.2 中的处理后,由于曲线在与背景坐标格的交点处会被断开,因此曲线会被分为几段。只需在每段曲线上任选一点,之后进行形态学重构,就可将曲线提取出来。现选如图3(为使图片清晰,图3 中的线条已被加粗)所示的7 个点。
图3 选点Fig.3 Points selection
表1 点的位置Tab.1 Points position
这7 个点在图像中的位置见表1。首先在程序主界面的 “选点” 面板中输入第一个点在图像中的位置: X:112,Y:413,然后点击 “选定”,这时程序会针对该点做形态学重构运算。该运算可以将与选定点相连的全部像素还原,在这里也就是将该点所在的曲线段还原。在2.2 节中,已将曲线与背景坐标格相交叉处的像素删除,这就使曲线与背景线条断开,因此在形态学重构时不会将背景线条还原。这样就可得到第1 点所在的曲线段。同样,在输入其余各点在图像中的坐标后,点击“选定”,就可得到全部曲线。如图4 所示。
图4 曲线图像提取结果Fig.4 The extraction results of curve image
虽然已将曲线从图像中提取出来,但此时得到的只是曲线上各点在图像中的位置而不是在坐标系中的值。因此还要将各点像素在图像处的行值与列值换算成坐标值。因为在实际的曲线中,一个横坐标值只能对应一个纵坐标值。所以在图4中,当一列中有多个像素点时,则取他们行值的均值。之后进行换算,换算公式为:
式中: xn—第n 个点的横坐标;xmin—曲线左端点的横坐标;xmax—曲线右端点的横坐标;cn—曲线上第n 个点所在的列数;cmin—曲线左端点所在的列数;cmax—曲线右端点所在的列数;yn—曲线上第n 个点的纵坐标;ymin—曲线纵坐标的最小值;ymax—曲线纵坐标的最大值;rn—曲线上第n 个点所在的行数;rmin—曲线最低点所在的行数;rmax—曲线最高点所在的行数。
在主界面中分别输入横坐标的最小值xmin=1000、最大值xmax=6000;纵坐标的最小值ymin=131、最大值ymax=221,然后点击 “生成曲线”,就可以得到最终的曲线,如图5所示。同时将曲线的坐标数据储存在了curve.mat 数据文件中,方便以后随时调用。当在Matlab 中导入curve.mat 文件时,可以得到其中包含的两个1维 数组curvex 和 curvey,curvex 中的第n 项和curvey中的第n 项对应于曲线第n个点的横坐标和纵坐标。
图5 提取出的最终曲线图Fig.5 The final result of extraction
(1)这种方法的优点是能够克服图像背景的干扰。先在灰度处理的部分通过调整灰度图像的上下阈值,去掉背景中与曲线灰度值相差较大的部分;之后运用形态学运算进一步消除掉背景中与曲线灰度值相进的部分,如坐标网格线和坐标轴。
(2)调用数据文件并使用Matlab 的插值或曲线拟合函数得到该曲线上任意一点的坐标值非常便捷。
(3)适用范围较广,除在文中用于提取发动机外特性曲线外,还可在食品、塑料等工程领域发挥作用。如提取微生物生长曲线以研究其对食品储存的影响,以及提取塑料材料的应力、黏度曲线等。
[1] 晏晖,姜鹏,陈贝. 基于Matlab 工具箱的数字图像处理技术[J]. 微计算机信息,2010,26(29-2):214-216.
[2] Gonzalez R C,Woods R E,Eddins SL,et. 数字图像处理的MATLAB 实现(第3 版)[M]. 北京:清华大学出版社,2013.
[3] 陈垚光,毛涛涛,王正林,等. 精通MATLAB GUI 设计(第3 版)[M]. 北京:电子工业出版社,2013.