1、计算机在生物工程中的应用GUI界面的设计学校:中南大学班级:生技0801姓名:bing学号:xxxxxxxx一、 综述在学习数学建模之时,我就经常听到老师对MATLAB的介绍,随着建模课程的深入,我逐渐应用到了一些初级MATLAB编程,解矩阵、算模型等一系列应用,当进入到计算机在生物工程中的应用这门课后,我真正认识到了MATLAB实用价值。MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。MATLAB由
2、一系列工具组成。这些工具方便用户使用MATLAB的函数和文件,其中许多工具采用的是图形用户界面。包括MATLAB桌面和命令窗口、历史命令窗口、编辑器和调试器、路径搜索和用于用户浏览帮助、工作空间、文件的浏览器。MATLAB自产生之日起就具有方便的数据可视化功能,以将向量和矩阵用图形表现出来,并且可以对图形进行标注和打印。高层次的作图包括二维和三维的可视化、图象处理、动画和表达式作图。可用于科学计算和工程绘图。新版本的MATLAB对整个图形处理功能作了很大的改进和完善,使它不仅在一般数据可视化软件都具有的功能(例如二维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(
3、例如图形的光照处理、色度处理以及四维数据的表现等),MATLAB同样表现了出色的处理能力。同时对一些特殊的可视化要求,例如图形对话等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。另外新版本的MATLAB还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。二、实验目的1.掌握MATLAB程序设计的基本知识,熟悉MATLAB语言及其在科学及其在科学计算中的运用; 2. 学习科学计算的可视化,图象分析技术;3. 掌握MATLAB的应用软件GUI设计;4. 掌握生物工程中的数据处理;5. 全面了解MATLAB在生物工程专业有关课程中的应用。三、解
4、题过程通过对GUI界面的编辑可以得到如下的一副综合界面图片:对彩色图像取任一颜色分量的图像或转换成灰度图像进行分析,可以测定白色区域的个数、面积和平均面积。 根据原题要求,利用GUI界面完成上述操作首先是对彩色图像转变成灰度图像的操作,为了更好的完善此功能,我分别对彩图能够进行灰度的转换以及蓝色、红色、绿色像素的提取,而且还加入了弹出对话框的功能,如果原图已经是彩色图像,则会出现对话框提醒。具体图像显示如下: 原图 灰度 blue green red如果已经是灰度图像了,在对其进行灰度化或者是提取像素,则会跳出对话框,显示原图像以是灰度图像,不能再进行转化。第一题:增加细菌图象处理软件GUI界
5、面的功能,使得可以测量照片1(fig0.jpg)中蓝色区域的个数与平均面积(以像素为单位),给出测量结果及截图。(照片1是癌症Hela 细胞蓝色DNA, 红色微管蛋白,绿色核有丝分裂器蛋白)照片1癌症Hela 细胞由于所需蓝色区域极为目标区域,所以只需对蓝色区域提取像素,从而就能够分析得到它的个数和平均面积, 利用我制作的GUI界面中,我们可以按如下步骤得到所需的数据,一下用图片来示意具体过程:第一步:打开图像第二步:图像转换(取蓝色部分)第三步:黑白图片(阈值100)第四步:目标测量由第四步目标测量,我们可以得到,白色区域的个数为168个,即蓝色部分个数为168个,平均面积由目标面积/个数所
6、得,最终为256.654个像素。第二题:照片2(fig1.jpg)中标尺的最小刻度是5毫米,请测量照片2中病变区域(白色)的个数、平均面积和占脾脏的面积百分数(使用自动阈值转变成黑白图像,不要进行腐蚀与膨胀处理)。照片2 曲霉菌侵袭的脾脏病变照片该要求可以通过具体对GUI的操作来实现,但由于所给图片较为复杂,需要处理过后求出整块肝脏的面积和病变面积,才能够算出脾脏的病变率,所以需要多不才能完成。具体步骤如下:打开图片-黑白图片(阈值120)-手工充填-反色负像-手工充填-反色负像-求得病变面积、病变区域面积和平均面积 由图可以看到所得病变面积为8903.625,病变个数为607个,目标面积为8
7、903.625,平均面积为14.6682。按照同样的方法,具体步骤如下:打开图片-黑白图片(阈值120)-手工充填-反色负像-自动充填-反色负像-求得肝脏总面积最终处理候的图片如下:因为已经得到肝脏总面积和病变面积,所以得到病变率=病变面积/肝脏总面积,计算结果如下图:为了加强结果的直观性,我设定了一个弹出框来独立显示结果,由图中可知,GUI界面输出病变率为9.9296%第三题:在GUI界面增加自动连续腐蚀并计数的功能,使得可以不断用4-邻域腐蚀操作腐蚀照片病变区域,同时测量腐蚀病变区域个数,一直腐蚀到病变区域消失为止,在可编辑文本框中输出腐蚀次数与剩余病变区域个数的测量结果。由于要使用4-邻
8、域的腐蚀操作,我们必须现在复选框中选定4-邻域选项,然后再使用连续腐蚀按钮,具体步骤如下:打开图片-黑白图片(阈值120)-手工充填-反色负像-手工充填-反色负像-连续腐蚀最终效果如图:图中的原始数据显示为(前面一位为腐蚀次数,后面一位为剩余病变个数) 0-607 1-286 2-133 3-55 4-15 5-2 6-1 7-0第四题:在GUI界面中增加一元非线性模型的建模的功能,软件可自动读取在可编辑文本框中输入的建模数据来建模,模型参数从另外的可编辑文本框输出,要求可以选择不少于两种的模型形式,其中要包含多项式回归模型,并能绘图表现原始数据点和模型曲。为了能够解决该题,我设置了两个函数分
9、别为logistic函数和polyfit函数,通过图区文本框中的数字,两个函数可以拟合出相应的曲线,并且通过plot绘制出图形在GUI界面中显示出来。下面就以polyfit函数和logistic函数来举例具体说该按钮的功能。具体步骤如下:输入数据-求解方式和曲线形式-数学建模通过输入一组数据,分别利用logistic函数和polyfit函数拟合,得出如下图:Logistic函数 Polyfit函数在进行多项式回归拟合前,先确定所需要的拟合次数,已达到最佳的拟合效果。在这里我输入3,即以三次方程来对改组数据进行拟合第五题:用3题的测量结果和4题增加的功能,以腐蚀次数为自变量,剩余病变区域个数为因
10、变量,用不少于两种的模型形式分别建立数学模型,并绘图给出原始数据点和模型曲线,比较不同数学模型的好坏(可以用剩余标准差判断),选出最好的数学模型。由题意可知,我们需要利用第三题中分析得到的两个变量结合第四题中的建模功能,分析出两种模型曲线的优劣,而判定优劣的标准我们利用剩余标准差判断,即残差平方来确定。Logistic函数Polyfit函数在进行多项式回归拟合前,先确定所需要的拟合次数,已达到最佳的拟合效果。在此,我们优化得到次数为3。拟合后所得图像如下:由残差的平方和我们看到当函数logistic时,残差平方为11481.9331,当函数polyfit时,残差的平方为2879.3812,因此
11、,我们可以确定polyfit拟合出来的函数更加的接近真实情况,该模型更好。四、学习心得通过一个学期对MATLAB的学习,我不仅学到了MATLAB的基础应用,还能够对较低端的GUI界面进行编辑,应用到实际工程中去。通过GUI界面的了解,我认识到了他在工程应用中的价值,特别是对生物工程,记起曾经在实验室显微镜下数菌的惨相,我深刻感受到GUI界面的价值,如果当时能有GUI界面来对照片进行编辑,那就可以直接利用电脑来对菌落进行计数,这不仅能够在实验中减少人为的误差,还能够节约实验时间,大大的提高实验效率,而时间在现代的社会生活中的地位是无可替代的,谁能够掌握时间谁就能够获得更多的成绩。在学习的过程中,
12、我从跟着老师一起模仿学习编辑GUI界面,将完整的函数程序按部就班的放入到M文件中,并且不断的对简单的灰度图象进行处理,如对米粒图象的处理,先将其取轮廓线,然后自动充填,对封闭的区域进行填充,再利用手动切割功能,将连在一起的米粒切开,然后腐蚀膨胀,最后利用计数功能将单个的米粒计算出来。在整个实验过程中,最复杂的要算是数学模型的建立了,在这一按钮设计中,不仅要对游离的数据自动读取进行建模,还要画出拟合图像,并且对其的残差平方进行比较得出较好的模型。而在编程中,自动读取让我百思不得其解,经过与同学的交流,最终将这个函数优化了出来,并且能够正常地运行,得到所需要的数据与所需图形。在编辑完程序后,我还将
13、界面进行了修饰,力求将界面美化,便于自己能够清晰的利用界面进行一些常规的操作。五、 附录25打开图像global I I0FileName,PathName=uigetfile(*.*,open files);FileName=strcat(PathName,FileName);I0=imread(FileName);I=I0;imshow(I);取轮廓线global Ialgorithm=get(findobj(Tag,popupmenu4),string);n=get(findobj(Tag,popupmenu4),value);I=edge(I,algorithmn,:);imshow(
14、I);图像转换global I I0t=get(findobj(Tag,popupmenu8),string);n=get(findobj(Tag,popupmenu8),value);t=tn,:; if strcmp(t,gray)&isrgb(I) I=rgb2gray(I);imshow(I);elseif strcmp(t,red)&isrgb(I) I=I(:,:,1);imshow(I);elseif strcmp(t,green)&isrgb(I) I=I(:,:,2);imshow(I);elseif strcmp(t,blue)&isrgb(I) I=I(:,:,3);im
15、show(I);elseif strcmp(t,color) I=I0;imshow(I);else msgbox(It is the gray one already!,Note);end反色负像global II=I;imshow(I);分割连体global II=improline(I);function I=improline(I,n)if nargin=2,n=8;elseif n=4,n=8;endCX,CY,C=improfile;while length(CX)1 k=1; Xk=round(CX(k); Yk=round(CY(k); C=I(Yk,Xk); while k0
16、.5 Xk=Xk+sign(CX(k)- Xk); if n=8,I(Yk,Xk)=C;end end if abs(CY(k)-Yk)0.5 Yk=Yk+sign(CY(k)-Yk); if n=8,I(Yk,Xk)=C;end end if n=4,I(Yk,Xk)=C;end end imshow(I); CX,CY,C=improfile;end自动补洞global II=imfill(I,holes);imshow(I);手工填充global II=imfill(I);imshow(I);腐蚀图像global ISE=zeros(3);for k=1:9SE(k)=get(findo
17、bj(Tag,strcat(checkbox,num2str(k),value);endI= imerode(I,SE);imshow(I);膨胀图像global ISE=zeros(3);for k=1:9SE(k)=get(findobj(Tag,strcat(checkbox,num2str(k),value);endI= imdilate(I,SE);imshow(I);异或图像global I I0I = xor(I,I0);imshow(I);暂存图像global I I0I0=I;imshow(I);黑白图像global Ilevel=str2num(get(findobj(Ta
18、g,edit28),String);if (level0)&(level0), i=i+1; pushbutton24_Callback();pushbutton35_Callback(); a=get(findobj(Tag,edit27),string); n=str2num(a); a=strcat(num2str(i),-,a); b(end+1)=a;endset(findobj(Tag,listbox4),string,b);、清除数据global aa=;set(findobj(Tag,listbox4),string,a);数学建模data=get(findobj(Tag,li
19、stbox4),string);l=length(data);for i=1:1:l str=datai,:; k=strfind(str,-); x(i)=str2num(str(1:k-1); y(i)=str2num(str(k+1:end);endM=get(findobj(Tag,popupmenu6),string);M=Mget(findobj(Tag,popupmenu6),value),:;if strcmp(M,Logistic) abc0=1,1,0.5;abc=lsqcurvefit(fun,abc0,x,y);factor=abc; elseif strcmp(M,p
20、olynomial) prompt=Input Number;title=Input Number;numlines=1;answer=inputdlg(prompt);m=str2num(answer1); factor=polyfit(x,y,m);endset(findobj(Tag,listbox3),string,factor);Plot=get(findobj(Tag,popupmenu5),string);Plot=Plotget(findobj(Tag,popupmenu5),value),:;if strcmp(Plot,polyval) xx=min(x):(max(x)-
21、min(x)/100:max(x); yy=polyval(factor,xx);elseif strcmp(Plot,Logistic) xx=min(x):(max(x)-min(x)/100:max(x); yy=fun(abc,xx);endplot(x,y,*,xx,yy);e=std2(yy);f=std2(y);set(findobj(Tag,edit15),string,num2str(e-f)2);set(findobj(Tag,edit16),string,num2str(max(f-e);data1=get(findobj(Tag,listbox3),string);l1=length(data1);set(findobj(Tag,edit19),string,num2str(l1);function y = fun(abc,x)y=1./(x+1).*(1/abc(1)+ abc(2)*abc(3).(x+1);