利用MATLAB实现医学图像处理与分析
利用MATLAB实现医学图像处理与分析边缘是图像最基本的特征。所谓边缘是指图像周围像素灰度有阶跃变化或屋顶状变化的像素的集合, 它存在于目标与背景、目标与目标、区域与区域、基元与基元之间。边缘具有方向和幅度两个特征, 沿边缘走向, 像素值变化比较平缓; 垂直于边缘走向, 像素值变化比较剧烈, 可能呈现阶跃状, 也可能呈现斜坡状因此, 边缘可以分为两种: 一种为阶跃性边缘, 它两边的像素灰度值有着明显的不同; 另一种为屋顶状边缘, 它位于灰度值从增加到减少的变化转折点。对于阶跃性边缘, 二阶方向导数在边缘处呈零交叉; 而对于屋顶状边缘, 二阶方向导数在边缘处取极值。第6期高向军,等:利用 MATLAB实现医学图像处理与分析1749d imw rie( modif, ank le_new series d en, n b)在 MATLA B中,笔者实现算法如下:a读入图像,预定义3.2 Levelset图像分割初始轮廓,如图3(a)所示;b定义离散化水平集函数;c)曲线在医学图像分割研究中,基于 level set技术的活动轮廓模演化,递准过程;d)求解演化后的零水平集,即为分割图像的型正引人注目。本实例在 MATLAB环境中,实现了Chm和边缘,如图3(b)所示。Ⅴese提出的无梯度的活动轮廓模型,并应用在医学图像分割之中。4结束语CⅤ分割方法的基本原理如下:没定义域为Ω的图像uo实践证明,MAT^AB软件功能强大、数据计算能力突出、被闭合边界C划分为目标O(C的内部)和背景B(C的外语言简洁易读。使用图像工具箱中的医学图像处理函数可以部)两个同质区域。两个区域的平均灰度分别为c1和c2此时方便快捷地实现医学图像的读写及简单处理功能。本文用实能量函数可看做为外部能量和内部能量之和,即例证明了在 MATLAB环境中可以方便、快速、有效地实现复杂E(cIc> C)=EinsidefC)+Eoutsidec)医学图像处理算法。同时Ⅵ ATLAR工具箱涉及的专业领域广H, m isc,(uo-Ci2dx dy+泛且功能強大。由于工具箱具有可靠性和开放性,可以方便H2IJout ie c)(o-C2)2dedy-YICI地直接加以使用,也可以将自己的代码加到工具箱中以改进函数功能。因比,在Ⅵ ATLA B(R2006b)环境下,实现医学图像的处理和分析具有很大的应用优势和价值。参考文献:1」田捷,包尚联,周明全.医学影像处理与分析[Ⅵ].北京:电子工业出版社,2003.(a)初始图像(b)分割结果「2]张尢赛,陈福民·D)IαM医学图像窗口变换的加速算法[J.计图3 Level set分割结果算机工程与应用,200339(13):218-2203]王立功,刘伟强,于甬华,等.DCOM医学图像文件格犬解析与当闭合边界C处于两个同质区域的边界时,能量达到最应用研究[J计算机工程与应用,20642(29):210212225小。为了解决曲线的拓扑变化问题,C-V分割法采用了水平[41曾筝,董芳华,陈咣,等.利用 MATLAB实现C断层图像的三维集方法,将闭合边界C嵌入高一维的曲面ψ中,根据初始闭合重建[J·CT理论与应用研究,200413(2):24-29曲线c构造一个内正外负的符号距离水平集函数中这样就5l任忠宝,李佳·基于 MATLA B的颅面三维重构技术J·计算机将关于闭合曲线C的能量函数转换为关于曲面中的能量函(6]王家文,李迎军.MAAB7.0图形图像处理(M].北京:国防数,再通过变分技术可以得到关于曲面的偏微分方程模型,即工业出版社,2006冲=1中/Yd(y中/1中1)-1(mo-c12+2(no-c2)2通(71HANT, VESE L. A ctive con bou rs w ithou t edges JI. EEE Tans过求由面的零水平集就可以得到C的位置mage Process 2001, 10(2): 266 277(上接第1740页)相比,本文算法虽然计算量有所增大,但能acam pos itc m ethod[ J]. Pattern Recogn tion 1982, 22(4: 381正确区分质量中等区域和质量较差的区域,并将背景区域和质385.量较差、后继算法无法恢复的噪声区域分割,保留质量巾等41 MEHTRE B M. F ngerp rmt m age ana ls s for autm atic ren tifica tion区域,使后续算法的处理区域更精确。I J] M achine Vis ion and App lica tons 1993, 6(2-3): 124-1395]苏彦华·Ⅴ balc++数字图像识別技术典型業例[M]·北京:人4结束语民邮电出版社,2004I6]耿茵茵,唐良瑞.指纹图像分级分割算法ⅠJ.北方工业大学学本文提出了一种改进的基于指纹灰度特性的指纹图像分200012(3):2-26割算法,克服了传统自适应阈值分割算法在指纹与背景交接区[7]甘树坤,欧宗瑛,魏鸿磊,基于灰度特性的指纹图像分割算法[J域,以及指纹内部脊线太淡或脊线粘连的区域分割不准及分割古林化工学院学报,200623(1):68-71前景边界的方坎效应问题,适用于更多类型的指纹图像,且分[8] ROSENFILD A, KAK A C. Digita I im age process ing[M].Naw割比较精确。实验结果表明,该算法的分割效果很好,对前景Yor a cadem i press 1976区和背景区的分割更加灵活准确,有效降低了指纹图像噪声的[9]G0 NAZALES R C. WOODSR E. D igital m age processing[M I影响,它不仅能分割出指纹质量较好的图像,也能有效地分割Read a add ison w esley 1992噪声干扰较大的指纹图像,经过分割后的图像指纹纹线清晰、「11田捷,杨鑫,生物特征识别技术理论与应用M],北京:子工业出版社,2005流畅,具有较强的适应性和很高的实用价值。目前该算法已被应用到成熟的指纹识别算法中。10]吴|金,朱兆达图像处理中阂值选取方法3年(192-1992)的进展(12)[J.数据采集与处狸19938(3):1920}(4):26278.参考文執I 12 BAZEN AM, GEREZ S H. Segn en tation of fingeprin t m ages[ c]//l]陆颍.指纹自动识别原理与方法综述[J]·工栏数学学报.2004Prme of the 12th Annual W orks op on C icu its Sys kms and Sign al21(6):10031010Pocess ng Neherland I s n, 2001 276-2802]硎 HANG J anwei I Heng li s udy on segm ent a lgorithm in au m a[l3]冯星奎,颜祖泉,肖兴明,等.指纹图像合成分割法[J.计算机l i fige prill ilen Lifica lion[ J. M cro oomputer Applica tons应用研究,200017(1):7G77199915(12)202214]韩思奇,王蕾·图像分割的阈值法综述丨J].系统工程与皃子技13 CMEBTREUM.C是是出m出是 lishing630 bihgts-ycscrved.htp/w. cnkinct
- 2020-12-10下载
- 积分:1
FreeRTOS中文入门手册
FreeRTOS中文入门手册方便初学者入门学习,讲的很好,很值得学习第一章任务管理Designed For Micr。 contr。11exs;概览附录中提供了使用源代码的实用信息小型多任务嵌入式系统简介不同的多任务系统有不同的侧重点。以工作站和桌面电脑为例:·早期的处理器非常昂贵,所以那时的多仟务用于实现在单处理器上支持多用户。这类系统中的调度算法侧重于让每个用户公平共享处理器时间。随着处理器功能越来越强大,价格却更偏宜,所以每个用户都可以独占一个或多个处理器。这类系统的调度算法则设计为计用户可以同时运行多个应用程序,而计算机也不会显得反应迟钝。例如某个用户可能同时运行了一个字处理程序,一个电子表格,一个邮件客户端和一个浏览器,并且期望每个应用程序任何时候都能对输入有足够快的响应时间。桌面电脑的输入处珒可以归类为软实时。为了保证用户的最佳体验,计算机对每个输入的响应应当限定在一个恰当的时间范围——但是如果响应时间超出了限定范闱,并不会让人觉得这合电脑无法使用。比如说,键盘操作必须在键按下后的某个时间内作出明显的提示。但如果按键提示超出了这个时间,会使得这个系统看起来响应人慢,而不致于说这台电脑不能使用。仅仅从单处理器运行多线程这一点来说,实时嵌入式系统中的多任务与桌面电脑的多任务从概念上来讲是相似的。但实时嵌入式系统的侧重点却不同于桌面电脑特别是当嵌入式系统期望提供硬实时行为的时候。硬实时功能必须在给定的时间限制之内完成——如果无法做到即意味着整个系统的绝对失败。汽车的安全气囊触发机制就是一个硬实吋功能的例子。安全气囊在撞击发生后给定时间限制内必须弹出。如果响应时间超出了这个时间限制,会使得驾驶员受到伤害,而这原本是可以避免的大多数嵌入式系统不仅能满足硬实时要求,也能满足软实时要求。Designed For Micr。 contr。11exs;术语说明在屮,每个执行线程都被称为任务。在嵌入式社区屮,对此并没有个公允的术语,但我更喜欢用任务而不是线程,因为从以前的经验米看,线程具有更多的特定含义本章的目的是让读者充分了解:在应用程序中,如何为各仟务分配处理时间。●在任意给定时刻,如何选择任务投入运行。●任务优先级如何影响系统行为。●任务存在哪些状态。此外,还期望能够让读者解:●如何实现一个任务。●如何创建一个或多个任务的实例●如何使用任务参数。如何改变一个已创建任务的优先级●如何删除任务。●如何实现周期性处理。空闲任务何时运行,可以用来干什么本章所介绍的概念是理解如何使用的基础,也是理解基于的应用程序行为方式的基础——因此,本章也是这本书中最为详尽的一章Designed For Micr。 contr。11exs;任务函数任务是由语言数实现的。唯一特别的只是任务的函数原犁,其必须返回而且带有一个指针参数。其数原型参见程序清单。void ATaskFunction( void *pvParameters )程序清单任务函数原型每个任务都是在自己权限氾围内的一个小程序。其具有程序入口,通常会运行在一个死循环中,也不会退出。一个典型的任务结构如程序清单所示。仟务不允许以任何方式从实现函数中返回一一它们绝不能有条语句,也不能执行到函数末尾。如果一个任务不再需要,可以显式地将其删除。这也在程序清单展现个任务函数可以用来创建若干个任务—创建出的任务均是独立的执行实例,拥有属于自己的栈空间,以及属于自己的自动变量栈变量,即任务函数本身定义的变量v。 d ATaskFunction(v。1d* pArameters)/*可以像普通函数一样定义变量。用这个函数创延的每个任务实例都有一个属于自己的 vAria1b1 eExamp1e变量。但如果 varial1e3 xample被定义为 static,这一点则不成立-这种情况下只存在一个变量,所有的任务实例将会共享这个变量。int ivariableExample =0;/*仨务通常实现在一个死循环中。*/for(ii)/*完成任务功能的代码将放在这里。*//*如果任务的具体实现会跳出上面的死循环,则此任务必须在函数运行完之前朋除。传入NUL参数表示删除的是当前任务*vTaskDelete( NULL程序清单典型的任务函数结构Designed For Micr。 contr。11exs;顶层任务状态应用程序可以包含多个任务。如果运行应用程序的微控制器只有一个核那么在任意给定时间,实际上只会有一个仼务被执行。这就意味着一个任务可以有一个或两个状态,即运行状态和非运行状态。我们先考虑这种最简单的模型——但请牢记这其实是过于简单,我们硝后将会看到非运行状态实际上又可划分为若千个子状态。当某个任务处于运行态时,处理器就正在执行它的代码。当一个任务处于非运行态时,该任务进行休眠,它的所有状态都被妥善保存,以便在下一次调试器决定让它进入运行态时可以恢复执行。当任务恢复执行时,其将精确地从离开运行态时正准备执行的那一条指令开始执行。A tasks that areOnly one tasknot currentcan be in theRunning are in theRunning state atNot Running Stateany one timeNot RunningRunning图顶层任务状态及状态转移任务从非运行态转移到运行态被称为切换入或切入或交换入相反,任务从运行态转移到非运行态被称为切换出或切出或交换出的调度器是能让任务切入切出的唯一实体。Designed For Micr。 contr。11exs;创建任务函数创建仟务使用的函数这可能是所有数中最复杂的函数,但不幸的是这也是我们第一个遇到的函数。但我们必须首先掌控任务因为它们是多任务系统中最基本的组件。本书中的所有示例程序都会用到,所以会有人量的例子可以参考。附录:描述川到的数据类型和命名约定。portBASE TYPE xTaskCreate( paTASK CODE pvTaskCodeconst signed port CHAR conist pcNameunsigned portSHORT usstackDepthunsigned portEASE TYPE uxPriorityxTaskHandle *pxCreatedTask程序清单函数原型表参数与返回值参数名描述任务只是永不退出的函数,实现常通常是个死循环。参数只一个指向任务的实现函数的指针效果上仅仅是函数名具有描述性的任务名。这个参数不会被使用。其只是单纯地用于辅助调试。识别一个具有可读性的名字总是比通过句柄来识别容易得多。应用程序可以通讨定义常量来定义任务名的最大长度—一包括结朿符。如果传入的字符串长度超过了这个最大值,字符串将会自动被截断。Designed For Micr。 contr。11exs;当任务创建时,内核会分为每个任务分配属于任务自己的唯一状态。值用于告诉内核为它分配多人的栈空间。这个值指定的是栈空间可以保存多少个字,而不是多少个字节比如说,如果是位宽的栈空间,传入的值为则将会分配字节的栈空间。栈深度乘以栈宽度的绩果万不能超过~个类型变量所能表达的最人值。应川程序通过定义常量来决定空闲任条任用的栈空间大小。在为微控制器架构提供的应用程序中,赋予此常量的值是对所有任务的最小建议值如果你的任务会使用大量栈空间,那么你应当赋予一个更大的值。没有任何简单的方法可以决定一个任务到底需要多大的栈空间。计算出来虽然是可能的,但人多数用户会先简单地赋予一个自认为合理的值,然后利用提供的特性来确证分配的空间既不欠缺也不浪费。第六章包括了一些信息,可以知道如何去查询任务使用了多少栈空问。仟务函数接受一个指向的指钅的值即是传递到任务中的值。这篇文档中的一些范例程序将会示范这个参数可以如何使用指定任务执行的优先级。优先级的取值范围可以从最低优先级到最高优先级是一个由用户定义的常量。优生级号并没有上限除了受限于采用的数据类型和系统的有效内存空间,但最妊使用实际需要的最小数值以避免内在浪费。如果的值超过了,将会导致实际赋给任务的优先级被自动封顶到最大合法值。Designed For Micr。 contr。11exs;用于传出任务的句柄。这个句枢将在调川中对该创建出来的任务进行引用,比如改变任务优先级,或者删除仟务。如果应用程序中不会用到这个任务的包柄,则川以被设为返回值有两个可能的返回值:表明任务创建成功。由于内存堆空间不足,无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务。第五章将提供更多有关内存管理方面的信息。例创建任务附录:包含一些关于示例程序生成工具的信息。本例演示了创建并启动两个任务的必要步骤。这两个任务只是周期性地打印输出守符串,采用原始的空循环方式来产生周期延迟。两者在创建时指定了相同的优先级,并且在实现上除输出的字符串外完全一样—程序清单4和程序清单5是这两个仟务对应的实现代码。Designed For Micr。 contr。11ers;
- 2020-12-09下载
- 积分:1