天天看點

matlab gui 項目實戰

matlab gui 項目實戰  

轉載請注明出處     -----     AA         

  Matlab gui目前是比較簡單的界面設計。由于在科研與工程結合時,需要快速的開發出一個原型化的系統,這時候使用matlab可以很好的把探索中的算法付諸實踐。

        這個是我在做皮膚病紅斑檢測時作出的程式:

matlab gui 項目實戰

           程式功能如下:

            1.open按鈕可以打開一張圖檔,即左上方的最大的圖。

            2.可以在大圖中按下滑鼠按鍵,拖動,畫出一個框(黑色)。通過兩個radio button 按鍵,我們可以知道劃取得這個框是取得的不帶紅斑的好皮膚,還是帶紅斑的病變皮膚。

            3.對劃取得到的圖像,正常皮膚顯示在右上角,帶紅斑的病變皮膚在左下角。

            4.下方中間是對紅斑識别後顯示出僞彩色圖像,交由醫生輔助判别的。

            5.下方右邊顯示對紅斑病變等級的判定統計直方圖。

           說明:由于是合作項目,我不能将識别後的結果顯示出來,大家見諒。

打開matlab以後,在指令行裡輸入:guide

matlab gui 項目實戰

選擇 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不一樣大的情況。這個隻有自己去調了。

因為我用的醫學圖像大小是固定的 , 是以不用怎麼調。我把代碼給大家展示一下

matlab gui 項目實戰

首先要用set,設定大小的機關,按我上面寫的就行。(或者在界面中選擇axes1的Unints屬性)

matlab gui 項目實戰

然後重新設定axes的大小就行了。

然後是滑鼠繪制框圖。這裡有3個消息,分别是滑鼠按下,滑鼠移動,滑鼠擡起。這個都好了解。按下滑鼠時記下目前滑鼠位置 ,移動時擷取滑鼠位置,随時畫框。注意,在畫框之前要調用一下imshow,把之前畫得框給覆寫掉。擡起滑鼠時,最後一次畫框。期間,按下滑鼠時要設一個标記位,使得移動時要知道滑鼠是否被按下。不然不按滑鼠左鍵,在圖像上也畫框就不對了。看下具體實作:

1.添加消息:滑鼠放到背景網格處,右鍵點選,選擇 view callbacks ,添加WindowButtonDownFcn,WindowButtonMotionFcn,WindowButtonUpFcn,與滑鼠按下,滑鼠移動,滑鼠擡起對應。

2.我們可以看到,添加的是function figure1_WindowButtonDownFcn(hObject, eventdata, handles);

現在明白為什麼說我們的架構是在一個figure下了麼?

matlab gui 項目實戰

從開始到set那行代碼是重新顯示了image,相當于進行了一次重新整理,把以前畫得框給擦掉了。

擷取滑鼠位置就是:

currPt = get(gca, 'CurrentPoint');

x0 = currPt(1,1);

y0 = currPt(1,2);

matlab gui 項目實戰

(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)就是原始的圖像的像素位置。

直接提取就可以了。

matlab gui 項目實戰

注意:y對應圖像的行,x才是列。

至于顯示統計直方圖的問題更簡單:

axes(handles.axes2);

hist(lable);

會了吧?lable是我識别紅斑後的結果,你可以換成im試試。

額 ,最後說一下,有些資料需要程式一開始就要初始化,可以在這裡添加:

matlab gui 項目實戰

要是想并行化的話可以這麼寫:

matlab gui 項目實戰

此時for就是并行的。

 額 少說了一個radio button。這個右鍵選中 button group,添加一個SelectionChangeFcn就可以了

matlab gui 項目實戰