1. 程式人生 > >[學習一個] Matlab GUI 學習筆記 Ⅰ

[學習一個] Matlab GUI 學習筆記 Ⅰ

blank 技術分享 提問 string 自學 水平 crop AD pin

Matlab GUI 學習筆記 Ⅰ

1. Foreword


  • Matlab 是嚴格意義上的編程語言嗎?曾經有人告訴我他是通過 Matlab 學會了面對對象編程,我是不信的,但這依然不妨礙它在特殊領域的強大功能。因為選修了這1個學分的 Matlab GUI 設計,亦有人表達了對Previous Matlab Blog的一些情緒,便寫上一些 Matlab GUI 編程學習的心得。
  • 標題雖為Matlab GUI 學習筆記 Ⅰ,亦可成為稱為圖像處理技術應用實踐 - 課程設計 1 指北。
  • 本文所用環境為 Matlab R2018a 中文版。

2. Task


  • 自學Matlab GUI編程,設計並實現一個圖像空間變換系統。
  • 要求:
    • 能對圖像進行平移、旋轉、縮放、剪切、投影、仿射、變換以及各種復合變換;
    • 能將各種變換後結果保存為圖像文件;
    • 各種變換可以采用按鈕或者菜單的方式進行;
    • 變換時的用戶可以自行設置簡單的變換參數。

3. Function


3.1 Create

  • 在命令行窗口中輸入guide選擇新建 GUI 標簽 Blank GUI(Default)
  • 中文版漢化的比較完整,左側工具條中所有選項對應的控件都有其中文名稱。
  • 在面板上右擊 -> 檢查器 -> Name 即可修改窗體標題
  • 主要用到AXES、BUTTON控件

3.2 File

萬事的起源。
實現效果 :
技術分享圖片

3.2.1 打開圖片

  • uigetdir 選擇文件(夾)
  • imread()讀入圖像
  • Code:

    [ReadImageFileName,ReadImagePathName,ReadImageFilterIndex] = uigetfile({'*.jpg;*.png;*.tif','ImageFile(*.jpg;*.png;*.tif)';...  
    '*.jpg','JPEGImageFile(*.jpg)';'*.*','AllFile(*.*)'},'ReadImage',...  
    'MultiSelect','off',...       
    'C:\Users\Public\Pictures\Sample Pictures');
     FirstImageFullPath = fullfile(ReadImagePathName,ReadImageFileName); 
    InputImage=imread(FirstImageFullPath);

3.2.2 保存圖片

  • uigetdir 選擇文件(夾)
  • imwrite()保存文件
  • Code:

    [SaveImagePathName] = uigetdir('C:\Users\Public\Pictures\Sample Pictures','請選擇文件夾');
    filepath=fullfile(SaveImagePathName,'result.jpg');  
    imwrite(ResultImage,filepath,'jpg');

3.2.3 顯示圖片

  • axes()定位顯示axes
  • imshow()顯示圖片
  • Code:

    axes(findobj('tag', 'axes1')); 
    InputImage=imread(FirstImageFullPath);
    imshow(InputImage);  

3.3 Transition

實現效果 :
技術分享圖片

3.3.1 平移

  • imdilate()函數實現圖像平移
  • Code:

    se=translate(strel(1),[100,100]);  
    ResultImage=imdilate(InputImage,se);

3.3.2 用戶交互

  • inputdlg()函數打開對話框與用戶交互
  • 根據獲得的返回值設置參數
  • 後文函數中涉及到用戶交互部分略去
  • Code:

    defaulta={'100'};
    a=inputdlg('請輸入x軸參數','',1,defaulta);

3.4 rotate

  • 實現效果:
    技術分享圖片
  • 使用imrotata()函數
  • Code : ResultImage = imrotate(InputImage,90);

3.5 Scale

  • 實現效果:
    技術分享圖片
  • 使用resize()函數
  • Code : ResultImage=imresize(InputImage,1.5);

3.6 Clipping

個人認為最難的部分。
最終實現效果:
技術分享圖片

3.6.1 按鈕交互

  • get(hObject,‘String‘);返回值為按鈕的標題
  • set(hObject,‘String‘,‘ChangeToTitle‘);改變按鈕的標題
  • 使用if語句嵌套判斷切換按鈕標題:

    now = get(hObject,'String');
    if now == '剪切'
    set(hObject,'String','確定');
    else
    set(hObject,'String','剪切');
    end

3.6.2 剪切圖像

  • 使用imrect()創建圖像選區
    e.g.imrect(句柄,選區大小);
  • getPosition()獲得位置
  • imcrop()剪輯圖像
  • Code:

    h=imrect(handles.axes1, [10 10 100 100]);  
    pos=getPosition(h);
    ResultImage=imcrop(InputImage, pos);

3.6.3 其他功能

  • getAPI()獲得函數句柄
  • addNewPositionCallback()添加監聽器
  • makeConstrainToRectFcn()監聽器事件

    api = iptgetapi(h);  
    api.addNewPositionCallback(@(p) title(mat2str(p,3)));  %標題顯示選區大小
    fcn = makeConstrainToRectFcn('imrect',get(gca,'XLim'),get(gca,'YLim'));  
    api.setPositionConstraintFcn(fcn);  %防止選區超出axes範圍

3.7 Projection

實現效果:
技術分享圖片

3.7.1 提問框交互

  • questdlg(Title,Text,choice,...,DafaultChoice)提問框函數
  • Code : s = questdlg(‘請選擇投影方式‘,‘參數‘,‘垂直‘,‘水平‘,‘垂直水平‘,‘垂直‘);

3.7.2 投影

  • 見書。
  • 參考

3.8 Affine & Transformation & ... & Postscript

No longer.

[學習一個] Matlab GUI 學習筆記 Ⅰ