基于界面GUI的图像处理软件综合设计.doc
摘要数字图像处理技术是20世纪60年代发展起来的一门新兴学科,随着图像处理理论和方法的逐步完善,使得数字图像处理技术在各个领域得到了广泛的应用,并显示出广阔的应用前景。MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台,它为数据分析和数据可视化、算法和应用程序开发提供了核心的数学和高级图形工具。MATLAB集成了功能强大的工具箱,MATLAB语言的语法特性与C语言极为相似,且更加简单,并且MATLAB语言可移植性好、扩展性强,再加上其中有丰富的图像处理函数,使得它在我们今后的学习和工作有越来越重要的作用。本报告主要描述了简单的基于界面GUI的图像处理软件综合设计以及嵌入式设计基于ICETEK-DM642-P4 的嵌入式DSP图像处理算法实现。这些都比较简单,主要为今后的学习打下基础。关键字MATLAB、界面GUI处理、数字图像处理目录摘要-------------------------------------------------2设计一、基于界面GUI的图像处理软件综合设计(基于Matlab )---------------------------------------------------4一、设计目的 -------------------------------------------------------------------4二、设计要求 -------------------------------------------------------------------4三、设计内容 -------------------------------------------------------------------4四、总体设计 -------------------------------------------------------------------4五、具体设计 -------------------------------------------------------------------5图像的读取与包存 ------------------------------------------------------------5图像转化为灰度图像 ----------------------------------------------------------6图像直方图统计和直方图均衡 -------------------------------------------6加入各种噪声,并通过几种滤波算法实现去噪------------------------------7边缘检测---------------------------------------------------12RGB图像处理------------------------------------------------14图像锐化---------------------------------------------------15六、结果分析 -------------------------------------------------17设计二、嵌入式设计基于ICETEK-DM642-P4 的嵌入式DSP图像理算法实现---------------------------------------------18一、设计目的------------------------------------------------------------------18二、设计内容------------------------------------------------------------------18三、具体设计------------------------------------------------------------------18熟悉TMS320C6000软件开发过程------------------------------------------------18了解边缘检测的算法和用途,利用Sobel 算子进行边缘检测,实现基于Sobel算子的边缘检测方法-----------------------------------------------------------------------------20四、实验结果------------------------------------------------------------------22心得体会---------------------------------------------22 设计一、基于界面GUI的图像处理软件综合设计(基于Matlab )一、 设计目的综合运用MATLAB工具箱实现图像处理的GUI程序设计。二、 设计要求1、 熟悉掌握MATLAB的程序设计方法。2、 掌握MATLAB GUI程序设计。3、 学习和熟悉MATLAB图像处理工具箱。4、 学会运用MATLAB图像处理工具箱对图像分析。三、 设计内容设计一个软件,实现功能包括图像的读取、存储、显示、图像转换、加噪、去噪、增强、边缘检测、直方图统计等。四、 总体设计因为我们要学习的是运用MATLAB工具箱设计的方法和步骤,再加上能力有限,所以该软件实现的功能较简单,其菜单如下设计完成时菜单界面如下五、 具体设计图像的读取与保存1、 打开设计的时候,通过打开一个对话框来实现,选择uigetfile函数来实现,uigetfile函数显示一个打开文件的对话框,该对话框自动列出当前路径下的目录和文件。其使用方法如下global im 定义一个全局变量imfilename,pathnameuigetfile*.*;*.bmp;*.tif;*.png,select picture; 选择图片路径strpathname filename; 合成路径文件名imimreadstr; 读取图片axeshandles.axes1; 使用第一个axesimshowim; 显示图片2、 保存同样通过打开一个对话框来实现,选择uiputfile函数来实现global BW 定义处理后的图片BW这个全局变量filename,pathname,filterindexuiputfile*.bmp;*.tif;*.png,save picture;存储图片路径if filterindex0return 如果取消操作,返回elsestrpathname filename; 合成路径文件名axeshandles.axes2; 使用第二个axesimwriteBW,str; 写入图片信息,即保存图片end3、 退出这就简单了,程序如下clc;close all;closegcf;图像转化为灰度图像。由于在matlab中较多的图像处理函数支持对灰度图像进行处理,故对图像进行灰度转化十分必要。可利用rgb2gray(X)函数对其他图像进行灰度图像的转化。转化实例如下实现程序段如下global Taxeshandles.axes2;Tgetimage;xrgb2grayhandles.img; imshowx;handles.imgx;guidatahObject,handles; pdlgprompt,,1,defans; p1str2nump1; fimresizehandles.img,p1,bilinear; imshowf; handles.imgf; guidatahObject,handles;end图像直方图统计和直方图均衡。 (1)通过histeq(X)函数实现直方图均衡。因为此函数只能对灰度图像进行直方图均衡。故应先将彩图转为灰度图像。 在上一步的基础上对第二幅图进行直方图均衡直方图均衡实现程序段如下 --- cutes on button press in pushbutton7.function pushbutton7_CallbackhObject, eventdata, handles hObject handle to pushbutton7 see GCBO eventdata reserved - to be defined in a future version of MATLAB handles structure with handles and user data see GUIDATAglobal Taxeshandles.axes2;Tgetimage;hhisteqhandles.img; imshowh;handles.imgh;guidatahObject,handles; 关键部分通过 hhisteqhandles.img进行直方图均衡 (2)直方图统计。通过利用imhistX函数来实现直方图统计。 --- cutes on button press in pushbutton8.function pushbutton8_CallbackhObject, eventdata, handles hObject handle to pushbutton8 see GCBO eventdata reserved - to be defined in a future version of MATLAB handles structure with handles and user data see GUIDATAaxeshandles.axes2;ximhisthandles.img; 直方图统计x1x110256;horz110256;barhorz,x1;axis0 255 0 15000;sethandles.axes2,xtick,050255;sethandles.axes2,ytick,0200015000;注意横纵坐标的范围应选取适当,否则,统计图表有可能超出范围。加入各种噪声,并通过几种滤波算法实现去噪。(1)加入噪声。通过imnoiseI,type,parameters来加入各种噪声。加入椒盐噪声加入高斯噪声加入乘性噪声实现程序段如下function uipanel4_SelectionChangeFcnhObject, eventdata, handles hObject handle to uipanel4 see GCBO eventdata reserved - to be defined in a future version of MATLAB handles structure with handles and user data see GUIDATAglobal TstrgethObject,string;axeshandles.axes2;switch str case 椒盐噪声 Tgetimage; prompt输入椒盐噪声参数1; defans0.02; pdlgprompt,,1,defans; p1str2nump1; fimnoisehandles.img,salt imshowf; handles.imgf; guidatahObject,handles; case 高斯噪声 Tgetimage; prompt输入高斯噪声1,输入高斯噪声2; defans0,0.02; pdlgprompt,,1,defans; p1str2nump1; p2str2nump2; fimnoisehandles.img,gaussian,p1,p2; imshowf; handles.imgf; guidatahObject,handles; case 乘性噪声 Tgetimage; prompt输入乘性噪声1; defans0.02; pdlgprompt,,1,defans; p1str2nump1; fimnoisehandles.img,speckle,p1; imshowf; handles.imgf; guidatahObject,handles; end(2)滤除噪声(高斯噪声)。(因为只能对灰度图滤波,所以应先转换为灰度图)滤波前中值滤波后低通滤波器滤波后实现程序段如下中值滤波global im;global y;y2doubley/255;MEDFILTmedfilt2y2,3 3;axeshandles.axes2;imshowMEDFILT,;低通滤波global imglobal yM Nsizeim;Ffft2y;fftshiftF;Dcut100;D1250;for u1M for v1N Du,vsqrtu2v2; BUTTERHu,v1/1sqrt2-1*Du,v/Dcut2; endend BUTTERGBUTTERH.*F; BUTTERfilteredifft2BUTTERG;axeshandles.axes2;imshowBUTTERfiltered,边缘检测Robert算法检测Sobel算法检测Prewitt算法检测Log算法检测Canny算子检测实现程序Robert算子global imglobal cwaxeshandles.axes2;cwedgeim ,robert;imshowcw;Sobel算子global imglobal dwaxeshandles.axes2;dwedgeim ,sobel;imshowdw;Prewitt算子global imglobal dwaxeshandles.axes2;dwedgeim ,prewitt;imshowdw;Log算子global imglobal dwaxeshandles.axes2;dwedgeim ,log;imshowdw;Canny算子global imglobal dwaxeshandles.axes2;dwedgeim ,canny;imshowdw;RGB图像处理转换为索引图转换为二值图实现程序索引图像global imY2rgb2indim,128;axeshandles.axes2;imshowY2;二值图像global imwmim2bwim,0.4;axeshandles.axes2;imshowwm;图像锐化Sobel算子滤波拉氏算子滤波空域高通滤波频域高通滤波实现程序Sobel算子滤波global imHfspecialsobel;Kfilter2H,im;axeshandles.axes2;imshowK;拉氏算子滤波global imamdoubleim;h0 1 0,1 -4 1,0 1 0;Jconv2am,h,same;Kam-J;axeshandles.axes2;imshowK;空域高通滤波global imjim2doubleimh-1 -1 -1,-1 9 -1,-1 -1 -1;Kconv2j,h,same;axeshandles.axes2;imshowK;频域高通滤波global imglobal yM Nsizeim;Ffft2y;fftshiftF;Dcut100;D1250;for u1M for v1N Du,vsqrtu2v2; BUTTERHu,v1/1sqrt2-1*Dcut/Du,v2; endend BUTTERGBUTTERH.*F; BUTTERfilteredifft2BUTTERG;axeshandles.axes2;imshowBUTTERfiltered,六、结果分析软件测试基本成功,课题所要求的功能均能较好实现。但一些功能只支持灰度图像的处理。其中值得一提的是在滤波处理中的低通滤波与高通滤波的效果。由于一般图像中含有较多的低频信息成分高频成分较少,通过低通滤波后,噪声以及高频成分被滤除,图像虽有少量失真,略显模糊,但尚可辨识。但若是通过高通滤波后,大量的有效低频信息被滤除,图像严重失真,不可辨识。设计二、嵌入式设计基于ICETEK-DM642-P4 的嵌入式DSP图像处理算法实现一、 设计目的 掌握Code Composer Studio2.2 的安装和配置,熟悉TMS320C6000软件开发过程,熟悉怎样运用该软件来做相关的实际图像处理。二、设计内容掌握Code Composer Studio2.2 的安装和配置,熟悉TMS320C6000软件开发过程创建工程和管理工程、编译和调试、使用观察窗口、了解图形功能(实验书P40-45);了解边缘检测的算法和用途,利用Sobel 算子进行边缘检测,实现基于Sobel算子的边缘检测方法(实验书P106-108) ; 在的基础上,修改核心代码,调试实现基于Prewitt算子的边缘检测方法。三、具体设计熟悉TMS320C6000软件开发过程1. 实验准备. 连接实验设备,连接220V 供电电源连线,请使用有质量保证的220V 电源插座。. 打开实验箱上的开关,给实验箱供电。上电正常时,ICETEK-DM642-P4 评估板的上电指示灯常亮,复位指示灯熄灭。注意如果在ICETEK-DM642-P4 评估板上电后,指示灯的亮灭状态不对,请立即关闭实验箱电源开关,检查设备。打开液晶显示屏电源开关,此时液晶显示屏上应显示条状彩条。如果没有彩条显示,请按下板上的S3 复位按钮,再次观察液晶显示屏是否有彩条输出。提示如果使用自配的图像输入设备和图像输出设备,请务必保证各设备与DM642-P4评估板的供电电源共地。如果不共地,过大的电压差,将击穿DM642 评估板。2. 设置Code Composer Studio2.2 在硬件仿真Emulator方式下运行请参照第二部分,第二章操作。3. 启动Code Composer Studio2.2双击桌面上“CCS 2C6000”,启动Code Composer Studio2.2;如果无法进入CCS软件,请参照第二部分,第三章操作,排除问题。4. 创建工程. 创建新的工程文件选择菜单“Project”的“New”项;在“Project Creation”对话框中,在“Project”项输入USECCS ; 单击“ Location ” 项末尾的浏览按钮, 改变目录到CICETEK-DM642-P4Lab501-USECCS,单击“OK”;单击“完成”;这时建立的是一个空的工程文件; 展开主窗口左侧工程管理窗口中“ Projects ” 下新建立的“USECCS .pjt”,其中各项均为空。提 示如果要创建库文件,只需要在建立新工程时,将“Project”中的选项更改为“Library .lib”即可。. 在工程文件中添加程序文件选择菜单“Project”的“Add Files to Project”项;在“Add Files to Project”对话框中选择文件目录为Lab501-USECCS,改变文件类型为“C Source Files*.c;*.ccc”,选择显示出来的文件“volum.c”;重复上述各步骤,添加volume.、load.asm 和vectors.asm 文件到USECCS 工程中如没有找到相应的文件,请选择改变文件类型来找;添加CtiC6000cgtoolslibrts6400.lib。. 编译连接工程选择菜单“Project”的“Rebuild All”项;注意编译过程中CCS 主窗口下部的“Build”提示窗中显示编译信息,最后将给出错误和警告的统计数。5. 编辑修改工程中的文件. 查看工程文件展开CCS 主窗口左侧工程管理窗中的工程各分支,可以看到“USECCS.pjt”工程中包含“volume.h”、“rts6400.lib”、“volume.c”和“volume.”等文件,其中“volume.h”为程序在编译时根据程序中的“include”语句自动加入的。. 查看源文件双击工程管理窗中的“volume.c”文件,可以查看程序内容。双击工程管理窗中的“volume.h”文件,打开此文件显示,可以看到其中有主程序中要用到的一些宏定义如“BUF_SIZE”等。“volume.”文件定义程序所放置的位置,此例中描述了DM642 的存储器资源,指定了程序和数据在内存中的位置。. 编辑修改源文件打开“volume.c”,找到“main”主函数,将语句“ ”最后的分号去掉,这样程序中就出现了一个语法错误;重新编译连接工程,可以发现编译信息窗口出现发现错误的提示,双击红色错误提示,CCS 自动转到程序中出错的地方;将语句修改正确这里是将语句末尾的分号加上;重新编译;注意,重新编译时修改的文件被CC 系统自动保存。. 修改工程文件的设置选择“Project”菜单中的“Build Options”项,打开“Build Options for USECCS.pjt”对话框,选择“Linker”卡片,在“Stack Size”项后输入1024;单击“确定”完成设置;通过此设置,重新编译后,程序中的堆栈的尺寸被设置成1024 个字。6. 基本调试功能. 执行FileLoad Program , 在随后打开的对话框中选择刚刚建立的Lab501-USECCSDebugUSECCS.out 文件。. 在项目浏览窗口中,双击volume.c 激活这个文件,移动光标到main行上,右击鼠标选择Toggle Breakpoint 或按F9 设置断点。. 选择DebugRun 或按F5 运行程序,程序会自动停在main函数头上。 按F10 执行到write_buffer函数上。 再按F8,程序将转到write_buffer 函数中运行。 此时,为了返回主函数,按shift-F7 完成write_buffer 函数的执行。 再次执行到write_buffer 一行,按F10 执行程序,对比与F8 执行的不同。注意 在执行C 语言的程序时,为了快速的运行到主函数调试自己的代码,可以使用DebugGo main 命令,上述实验中的使用的是较为繁琐的一种方法。7. 使用观察窗口. 执行ViewWatch Window 打开观察窗口。. 在volume.c 中,选中任意一个变量,右击鼠标,选择“Quick Watch”,CCS 将打开QuickWatch 窗口并显示选中的变量。. 在volume.c 中,选中任意一个变量,右击鼠标,选择“Add to Watch Window”,CCS将把变量添加到观察窗口并显示选中的变量值。. 在观察窗口中双击变量,则弹出修改变量窗口,此时,可以在这个窗口中改变程序变量的值。. 把str 变量加到观察窗口中,点击变量左边的””,观察窗口可以展开结构变量,并且显示结构变量的每个元素的值。. 把str 变量加到观察窗口中;执行程序进入write_buffer 函数,此时num 函数超出了作用范围,可以利用Call Stack 窗口察看在不同作用范围的变量 执行ViewCall Stack 打开堆栈窗口。 双击堆栈窗口的main选项,此时可以察看num 变量的值。8. 文件输入/输出这一节介绍如何从PC 机上加载数据到目标机上。可用于使用已知的数据流测试算法的正确性。在完成下面的操作以前,先介绍Code Composer Studio 的Probe(探针)断点,这种断点允许用户在指定位置提取/注入数据。Probe 断点可以设置在程序的任何位置,.当程序运行到Probe 断点时,与Probe 断点相关的事件将会被触发,当事件结束后,程序会继续执行。在这一节里,Probe 断点触发的事件是从PC 机的数据文件加载数据到目标系统的缓冲区中。. 在真实的系统中,read_signals 函数用于读取A/D 模块的数据并放到DSP 缓冲区中。在这里,代替A/D 模块完成这个工作的是Probe 断点。当执行到函数read_signals时,Probe 断点完成这个工作。 在程序行read_signalsint *上单击鼠标右键,选择“Toggle breakpoint”,设置软件断点。 单击鼠标右键,选择“Toggle Probe Point”,设置Probe 断点。. 执行FileFile I/O,打开对话框。. 点击Add File 把sine2.dat 文件加到对话框中。. 完成设置 在Address 中,输入inp_buffer 在Length 中,输入100 保证warp around 被选中;. 关联事件和Probe 断点 点击Add Probe Point 按钮,打开对话框; 点击Probe Point 列表中的内容,使之被选中; 在Connect 中选择sine2.dat 文件; 点击Replace 按钮确认设置; 点击“确定”关闭对话框。. 点击“确定”关闭对话框,此时,已经配置好了Probe 断点和与之关联的事件.进一步的结果在下面实验中显示了解边缘检测的算法和用途,利用Sobel 算子进行边缘检测,实现基于Sobel算子的边缘检测方法1 把数据从视频通道通过一维方式传送到片内RAM中并作Sobel边缘提取算法。我们只对摄像头采集的一块数据进行Sobel边缘提取。采用一维EDMA传送方式,每一次传送采集的一行中的部分数据(DAT_copy()函数)。在PAL制式下,先把一行数据放到nMemTemp数组中,比如我们要把从144行到432行,从180列到435列的图像进行Sobel边缘提取,最后把变换后的数据输出到显示缓冲区。 unsigned char nMemTemp720;for i 0; i numLines; i m_nIDDAT_copycapFrameBuf-frame.iFrm.y1i*capLinePitch,nMemTemp,numPixels; DAT_waitm_nID; if i144 DAT_copynMemTemp,disFrameBuf-frame.iFrm.y1i*disLinePitch,numPixels;因为Sobel算法需要三行数据,我们可以开辟一个可以存放三行数据的缓冲区,通过指针的交换把从视频通道过来的数据分别放到缓冲区中。保存的三行图像使用翻卷的缓冲区管理,三个变量分别指示当前使用的y行、y-1行和y-2行在缓冲区中的起始偏移量。我们可以这样来做轮流往三块缓存区拷贝数据。只要拷贝的指针变化就可以。在我们拷贝当前这一块的时候,已经拷贝的另外两块数据依然没有变化,所以我们就可以实现三块数据保存采集图像中的相邻的三行数据。如下缓冲区1cLines0-255缓冲区2cLines256-512缓冲区3cLines513-768三个指针*pImg1,*pImg2,*pImg3分别轮流指向三个缓冲区。 m_nOffset10; m_nOffset2256; m_nOffset3512;unsigned char cLines256*3;void Sobel unsigned int m_nID;m_nIDDAT_copynMemTemp180,cLinesm_nOffset3,256;pImg1cLines; pImg1m_nOffset1;pImg2cLines; pImg2m_nOffset2;pImg3cLines; pImg3m_nOffset3;x1*pImg1; pImg1; x2*pImg1; pImg1;x4*pImg2; pImg2; x5*pImg2; pImg2;x7*pImg3; pImg3; x8*pImg3; pImg3; for mi0;mi256;mi,pImg1,pImg2,pImg3 x3*pImg1; x6*pImg2; x9*pImg3;m_nWork1x7x8x8-x2-x2-x3;m_nWork2x3x6x6-x4-x4-x7;if m_nWork1m_nWork2 m_nWork1m_nWork2; m_nWork2m_nWork1x9-x1; if m_nWork2255 m_nWork21; else if m_nWork20 m_nWork20; nMemTempmi180m_nWork2; x1x2; x2x3; x4x5; x5x6; x7x8; x8x9 nMemTempmi0;m_nWorkm_nOffset1; m_nOffset1m_nOffset2;m_nOffset2m_nOffset3; m_nOffset3m_nWork;2 把数据从视频通道通过二维方式传送到SDRAM中并作Sobel边缘提取算法。我们可以通过DAT_copy2d函数直接把采集的一幅图像亮度分量存放到SDRAM中,如下DAT_copy2dDAT_2D2D, capFrameBuf-frame.iFrm.y1, m_dbFrameBufferTemp, numPixels, numLines, numPixels;其中m_dbFrameBufferTemp是指向SDRAM中缓冲区的指针,numPixels是一行的象素数,numLines是行数。当把数据存放到SDRAM的一个数组中后,Sobel算法的实现就非常简单了。当然也可以参照一维的方法来实现。四、实验结果.这次硬件实验经过不断调试,做得很成功,实验箱的显示板上显示了我们想要的结果。 心得体会通过为期两周的matlab课程设计实践,使我对matlab的使用有了进一步的了解和熟悉。 当我第一次拿到此次的课题时,感到有些无所适从。虽然,曾经学习过matlab的课程,在课程的考核中也取得了较好的成绩,但由于对matlab的学习更多的只是停留在理论上的学习,在课时内的试验也只是简单的基础性试验, 所以对matlab实际运用不是很熟练。虽然对课题感到很懵懂,但在霍老师的简单提示与指导后,我开始找到了解决问题的路径。我选择的是“利用matlab的GUI程序设计一个简单实用的图像处理程序”这一课题。本课题的重点是句柄的使用、GUI的使用以及matlab中相关图像处理函数使用。 为此,在实践正式开始前,我利用课余时间,重新复习了matlab教材,专门借阅了利用matlab进行图像处理的相关教程,通过索引网络上的相关资料,为课设做了较为充分的准备。在参考了相关材料及源程序,我对自己要做的课设内容有了进一步的了解,并对matlab的使用有了更深的体会。 当然,在课设的进行过