matlab gui 项目实战

来源:互联网 发布:apache ant 1.9.3 bin 编辑:程序博客网 时间:2024/05/16 05:55

matlab gui 项目实战  


转载请注明出处     -----     AA         

 

  Matlab gui目前是比较简单的界面设计。由于在科研与工程结合时,需要快速的开发出一个原型化的系统,这时候使用matlab可以很好的把探索中的算法付诸实践。
        这个是我在做皮肤病红斑检测时作出的程序:


        
           程序功能如下:
            1.open按钮可以打开一张图片,即左上方的最大的图。
            2.可以在大图中按下鼠标按键,拖动,画出一个框(黑色)。通过两个radio button 按键,我们可以知道划取得这个框是取得的不带红斑的好皮肤,还是带红斑的病变皮肤。
            3.对划取得到的图像,正常皮肤显示在右上角,带红斑的病变皮肤在左下角。
            4.下方中间是对红斑识别后显示出伪彩色图像,交由医生辅助判别的。
            5.下方右边显示对红斑病变等级的判定统计直方图。
           说明:由于是合作项目,我不能将识别后的结果显示出来,大家见谅。
打开matlab以后,在命令行里输入:guide

 

选择 default 即可。拖控件如下所示(这个会吧?自己改string属性)

这里我们说下架构啊,matlab是生成了一个figure,这个都懂吧,imshow显示一幅图片的时候就是这种figure。
然后我们拖出来的控件是放到figure上的。也就是说带网格的背景是figure,所有的控件都是放在他上面的。

现在先说控件消息。
右键点击Open按钮,选择 view callbacks ,选择call back


[filename, pathname] = uigetfile({'*.jpg'},'select');  %这个是生成一个打开文件的对话框,获取路径和文件名
str = [pathname filename];%生成完整的路径+文件名
im  = imread(str);%读取图片
axes(handles.axes1);%这个是指定下一句imshow把图片显示到哪个axes
im_handle = imshow(im);
这样就把显示图片做好了。其中可能会有图片大小和我们的axes不一样大的情况。这个只有自己去调了。
因为我用的医学图像大小是固定的 , 所以不用怎么调。我把代码给大家展示一下

首先要用set,设定大小的单位,按我上面写的就行。(或者在界面中选择axes1的Unints属性)

然后重新设定axes的大小就行了。

 

然后是鼠标绘制框图。这里有3个消息,分别是鼠标按下,鼠标移动,鼠标抬起。这个都好理解。按下鼠标时记下当前鼠标位置 ,移动时获取鼠标位置,随时画框。注意,在画框之前要调用一下imshow,把之前画得框给覆盖掉。抬起鼠标时,最后一次画框。期间,按下鼠标时要设一个标记位,使得移动时要知道鼠标是否被按下。不然不按鼠标左键,在图像上也画框就不对了。看下具体实现:
1.添加消息:鼠标放到背景网格处,右键点击,选择 view callbacks ,添加WindowButtonDownFcn,WindowButtonMotionFcn,WindowButtonUpFcn,与鼠标按下,鼠标移动,鼠标抬起对应。
2.我们可以看到,添加的是function figure1_WindowButtonDownFcn(hObject, eventdata, handles);
现在明白为什么说我们的框架是在一个figure下了么?

从开始到set那行代码是重新显示了image,相当于进行了一次刷新,把以前画得框给擦掉了。
获取鼠标位置就是:
currPt = get(gca, 'CurrentPoint');
x0 = currPt(1,1);
y0 = currPt(1,2);

(x1,y1)就是移动时获取的鼠标实时坐标,然后调用
rect=[min([x0,x1]),min([y0,y1]),abs(x1-x0),abs(y1-y0)];做出一个矩形,
刷新一下,绘制出来:rectangle('Position',rect,'LineStyle',':');
这样就可以了。
drawtag == 1;%这个就是我说的标记位,可以通过
global  x0 y0 x1 y1 im drawtag im_handle;%把要用的数据设为全局变量

鼠标抬起的消息我就不说了啊,自己设吧。


3.把框定的图像取出来:
因为之前已经用set,设定大小的单位,上面说了(或者在界面中选择axes1的Unints属性)

现在鼠标的位置(x0,y0),(x1,y1)就是原始的图像的像素位置。
直接提取就可以了。

注意:y对应图像的行,x才是列。
至于显示统计直方图的问题更简单:

axes(handles.axes2);
hist(lable);

会了吧?lable是我识别红斑后的结果,你可以换成im试试。

额 ,最后说一下,有些数据需要程序一开始就要初始化,可以在这里添加:

要是想并行化的话可以这么写:


此时for就是并行的。

 额 少说了一个radio button。这个右键选中 button group,添加一个SelectionChangeFcn就可以了

 

原创粉丝点击