数字图像处理高级应用:基于MATLAB与CUDA的实现(第2版) (精通MATLAB)
上QQ阅读APP看书,第一时间看更新

第1章 热点图像处理方法原理及其MATLAB仿真

1.1 基于模型的图像边缘检测及其代码快速生成

1.1.1 模型驱动开发思想概述

基于模型设计方法是一种设计复杂系统的可视化数学方法。基于模型的软件开发方法是一种以模型为中心的软件设计方法,用模型来形式化表示用户所构建系统的功能、行为和结构。形式化的意思是指描述模型的语言具有定义良好的语法和语义。基于模型设计思想是通过模型抽象和描述系统的关键问题,用模型表示出系统解决方案,并通过形式化的工具对系统模型进行验证,以保证系统设计正确性。基于模型设计思想从根本上解决了软件设计的正确性保证问题。

什么是模型?模型可以是具体的物理实体,也可以是抽象的描述,如图像描述、数学表达式。模型特征是对对应的物理系统或者非物理系统的一种简化表示,是人们的一种有意识的创造物。有了模型,系统开发人员就可以依赖模型来构建系统,而忽略掉无关的细节。

系统建模和模型仿真验证是基于模型设计方法的两个重点。采用特定的建模语言和模型设计工具,来抽象出被描述的目标系统,从而建立准确的模型,这样可以消除其他系统描述方式(比如文本描述)的模糊性和二义性。仿真验证毫无疑问需要基于建立好的准确的目标模型,而仿真验证带来的好处是通过相应的仿真验证工具对模型进行仿真验证之后可以保证模型的正确性。

模型驱动架构(Model Driven Architecture, MDA)是2002年被提出的,包含了模型的精确形式化表示、模型存储以及模型交换等方面的一系列规约,如MOF(Meta Object Facility)、OCL(Object Constraint Language)、XMI(XML Metadata Interchange)等,旨在提高程序设计的抽象层次,提高软件开发效率,增强软件的可移植性、协同工作能力和可维护性。要求设计时进行严格的模型定义,力求最终能全部或部分自动生成工程代码。

MDA的软件开发过程是由软件系统建模驱动的。模型根据抽象层次不同可分为平台无关模型PIM和平台相关模型PSM。平台无关模型描述系统的行为需求不涉及平台实现细节,平台无关模型的设计者专注于表示系统的业务逻辑;平台相关模型不仅包含系统功能描述,而且包含实现平台的设计思想。平台无关模型可以被转换为一个或多个平台相关模型,平台相关模型最终会转换成具体平台的实现代码。MDA软件开发周期如图1.1.1所示。

图1.1.1 MDA软件开发周期

MDA引入了模型驱动开发(Model-Driven Development, MDD)的软件开发和模型集成运算(Model-Integrated Computing, MIC)的开发模式。模型驱动开发是当今嵌入式系统开发方法的热点,模型集成运算开发方法是面向领域的模型驱动开发方法,在面向特定领域的建模语言方面扩展了模型驱动开发方法,能通过元模型针对特定领域进行定制和裁剪,并能基于领域模型自动生成代码。

代码生成的概念最初见于编译器设计和开发中,编译器先将输入的源程序翻译成某种中间表示,然后产生等价的某种目标程序语言表示的目标程序。这种将中间表示生成目标程序的过程也是代码生成,但是在基于模型的软件设计方法中的代码生成是指利用计算机程序(代码生成器)将模型自动地生成可用的代码。代码生成的过程大致包括模型建立和生成代码。建立一个好的能准确描述应用系统并充分考虑系统应用环境的模型并没有解决所有问题,因为必须将这个模型转化成有效的可运行的模型代码。

基于模型的软件开发方法和传统的软件开发方法有着显著的区别。传统的软件开发方法如图1.1.2所示,其核心是代码,代码的开发、测试和维护占用项目开发的绝大多数时间和精力。而基于模型的软件开发方法,如图1.1.3所示,其核心是模型,项目开发的主要工作是模型的设计,测试和维护也是围绕着模型来开展的,其代码可以方便地依据模型而自动生成。代码生成可以很好地提升软件开发效率、缩短软件开发周期、提高软件开发效率。

图1.1.2 传统的以代码为中心的软件开发方法

图1.1.3 以模型为中心的软件开发方法

1.1.2 模型驱动开发的优势

基于模型驱动的设计开发在各个过程之间没有阻碍,它的优势在于:

(1)在统一的开发、测试平台上,允许产品从需求分析阶段就开始验证,并做到持续不断的验证与测试;

(2)产品的缺陷暴露在产品开发的初级阶段,开发者把主要精力放在算法和测试的研究上,代码生成和验证过程则留给计算机自动完成;

(3)大大缩短开发周期,降低开发成本。

1.1.3 模型驱动开发在图像处理领域中的应用

众所周知,数字图像处理的实现过程中代码量巨大,将模型驱动开发引入到图像处理领域,则可大大提高其规范性和高效性。

基于模型驱动的数字图像处理的主要步骤包括:

(1)需求分析;

(2)将实现过程按照逻辑先后顺序分为各个阶段,再将各个阶段按照功能划分为各个模块;

(3)建立基于功能模块的模型,并进行仿真;

(4)代码自动生成。

1.1.4 基于Simulink-Blocks的模型驱动开发图像处理

MATLAB中的计算机视觉系统工具箱(Computer Vision System)如图1.1.4所示,提供了视频和图像处理的各种模型,共计11个大类库,每个模型库提供了数种模块。用户可以通过拖动、组合,构建视频和图像处理模型,进行视频和图像的仿真和分析。

图1.1.4 计算机视觉系统工具箱的路径

启动MATLAB,选择菜单栏的Simulink Library,按图1.1.4所示选择Computer Vision System Toolbox,系统就会显示计算机视觉系统工具箱,如图1.1.5所示。视频和图像处理模块包含Sources(输入模块)、Sinks(输出模块)、Analysis &Enhancement(分析和增强)、Conversions(转换)、Filtering(滤波)、Geometric Transformations(几何变换)、Morphological Operations(形态学运算)、Statistics(统计)、Text &Graphics(文本和图像)、Transforms(变换)和Utilities(自定义)11个大类库。这几乎包含了图像处理中的所有操作和算法,并附带了文字标注子模块,为图像处理的模型建立和仿真提供了充足的模块。

图1.1.5 计算机视觉系统工具箱模块

1.1.5 基于Sobel算子的边缘检测的基本原理

边缘是图像最基本的特征。边缘检测在计算机视觉、图像分析等应用中起着重要的作用,是图像分析与识别的重要环节。因为图像的边缘包含了用于识别的有用信息,所以边缘检测是图像分析和模式识别的主要特征提取手段。

所谓边缘,是指其周围像素灰度阶跃变化或屋顶状变化的那些像素的集合,它存在于目标与背景、目标与目标、区域与区域、基元与基元之间。因此,它是图像分割所依赖的重要特征,也是纹理特征的重要信息源和形状特征的基础;而图像的纹理形状特征的提取又常常依赖于图像分割。图像的边缘提取也是图像匹配的基础,因为它是位置的标志,对灰度的变化不敏感,所以可作为匹配的特征点。

图像的其他特征都是由边缘和区域这些基本特征推导出来的。边缘具有方向和幅度两个特征。沿边缘走向,像素变化比较平缓;而垂直于边缘走向,像素变化比较剧烈,而这种剧烈变化可能呈现阶跃状,也可能呈现斜坡状。边缘上的这种变化可以用微分算子检测出来,通常用一阶或二阶导数来检测边缘。不同的是,一阶导数认为最大值对应边缘位置,而二阶导数则以过零点对应边缘位置。

边缘检测的步骤如下:

(1)图像滤波。边缘检测算法主要是基于图像亮度的一阶和二阶导数,但是导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能。

(2)图像增强。增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将邻域强度值有显著变化的点突出显示。

(3)图像检测。在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,应该用某些方法来确定哪些是边缘点。最简单的边缘检测判据是梯度幅值阈值判据。

(4)图像定位。如果某一应用场合要求确定边缘位置,则边缘的位置可以在子像素分辨率上来估计,边缘的方位也可以被估计出来。

对于图像的边缘检测来说,一般在识别过程中有如下要求:

(1)首先能够正确地检测出有效的边缘;

(2)边缘定位的精度要高;

(3)检测的响应最好是单像素的;

(4)对于不同尺度的边缘都能有较好的响应并尽量减少漏检;

(5)对噪声应该不敏感;

(6)检测的灵敏度受边缘方向影响应该小。

边缘检测的实质是采用某种算法来提取出图像中的对象与背景间的交界线。图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此可以利用局部图像微分技术获得边缘检测算子。经典的边缘检测方法是对原始图像中像素的某个小邻域来构造边缘检测算子。

Sobel算子的基本原理是将图像中每个像素的上、下、左、右四邻域的灰度值加权差,与之接近的邻域的权值最大。因此,Sobel算子定义如下:

sx={f(x+1, y-1)+2f(x+1, y)+f(x+1, y+1)}

-{f(x-1, y-1)+2f(x-1, y)+f(x-1, y+1)}

sy={f(x-1, y+1)+2f(x, y+1)+f(x+1, y+1)}

-{f(x-1, y-1)+2f(x, y)+f(x+1, y-1)}

该方法不但能产生较好的检测效果,而且对噪声具有平滑作用,可以提供较为精确的边缘方向信息。但是,在抗噪声好的同时增加了计算量,而且也会检测出伪边缘,定位精度不高。如果检测中对精度的要求不高,则该方法较为常用。

1.1.6 基于模型的实现

下面就通过一个例子来看一下,如何通过MATLAB Simulink-Blocks来实现基于模型驱动的数字图像处理。

(1)需求分析。对输入的图像进行Sobel边缘检测。

(2)实现步骤。RGB图像输入→转换成灰度图像→边缘提取。

(3)建立功能模块,并通过功能模块进行仿真。

其中,各功能模块及其路径如表1.1.1所列,连接方式如图1.1.6所示。

表1.1.1 各功能模块及其路径

图1.1.6 基于模型驱动的Sobel边缘检测

对各模块的属性进行设置如下:

(1)双击Image From File模块,将其参数设置为如图1.1.7所示的内容。

图1.1.7 Image From File模块参数设置

(2)双击Color Space Conversion模块,将其参数设置为如图1.1.8所示的参数。

图1.1.8 Color Space Conversion模块参数设置

(3)双击Edge Detection模块,将其参数设置为如图1.1.9所示的参数。

图1.1.9 Edge Detection模块参数设置

在完成各功能模块的设置之后,对整个模型进行仿真,证明该模型是正确的并且是可行的,其运行效果如图1.1.10所示。

图1.1.10 模型仿真结果

1.1.7 代码的快速生成

接下来,进行代码的自动生成。在Simulation下拉菜单下,选择Configuration Parameters,如图1.1.11所示。

图1.1.11 选择Configuration Parameters操作

将Solver options的属性设置为Fixed-step,如图1.1.12所示。

图1.1.12 将Solver options的属性设置为Fixed-step

单击Code Generation下的Build按钮(如图1.1.13所示),便可生成可执行的C代码,如图1.1.14所示。

图1.1.13 单击Code Generation下的Build按钮

图1.1.14 生成的可执行的C代码