〇、寫在前面
??本文為一個剛?cè)腴T MATLAB 的學(xué)生所寫,內(nèi)容是使用 APP Designer 做一個 GUI 界面的圖像處理的小工具。還有很多不足,歡迎批評指正。
??APP Designer 學(xué)習(xí)教程指路??MATLAB App Designer基礎(chǔ)教程Matlab GUI界面設(shè)計
??作業(yè)要求指路??數(shù)字圖像處理之matlab大作業(yè):自制圖像處理小工具
一、設(shè)計思路
??最開始畫的界面(左)和最終完成界面(右)如下圖所示。
??我最開始的設(shè)計是有左右切換按鈕的,但后來發(fā)現(xiàn)只做一頁更加方便也更好看,所以就改了一下。
二、功能模塊
??在開始敲代碼之前,首先了解一下局部變量和全局變量。課程指路??局部變量和全局變量的理解和類的解釋
??我在這個作業(yè)中一共定義了四個全局變量:
properties (Access = private)
Super_Image % 全局圖像
Temp_Image % 臨時圖像
Change_Image % 添加噪聲后的圖像
Count_Image % 硬幣計數(shù)
end
??在知道什么是全局變量后,我們就可以開始一步一步來碼代碼啦!
1、導(dǎo)入圖片
從您的計算機(jī)中選擇圖像
??導(dǎo)入圖片可以從文件夾導(dǎo)入圖片,也可以從攝像頭加載圖片,我選擇的是從文件夾導(dǎo)入圖片。學(xué)習(xí) uigetfile( ) 函數(shù)的教程指路??錯誤提示框和uigetfile交互式獲取文件-strcat函數(shù)拼接
??我在看了教程之后,再結(jié)合了一些網(wǎng)上的其他內(nèi)容(找不到鏈接了),寫下了以下代碼:
%從資源管理器獲取圖像
[filename, pathname]=uigetfile(...
{
'*.tif;*.bmp;*.png;*.jpg',...
'Image Files(*.tif,*.bmp,*.png,*.jpg)'},...
'選擇圖片');
if isequal(filename,0) || isequal(pathname,0)
return;
else
%記錄獲取文件的名字和路徑
app.Super_Image = strcat(pathname,filename); %將讀取到的圖像賦給全局圖像
app.Temp_Image = strcat(pathname,filename); %將讀取到的圖像賦給臨時圖像
end
im = imread(app.Super_Image); %讀取全局圖像
imshow(im,'Parent',app.Ori_Image); %將全局圖像顯示在原圖坐標(biāo)區(qū)
??將以上代碼添加到 “打開圖像” 按鈕回調(diào)函數(shù)中,可實現(xiàn)在文件夾獲取圖片的效果:
2、保存圖像
將處理后的圖像保存到您的計算機(jī)中
??這一部分內(nèi)容我是參考了網(wǎng)上的一些案例,能夠?qū)崿F(xiàn)將效果預(yù)覽坐標(biāo)區(qū)的圖像保存到計算機(jī)中。
??代碼如下:
if ~isempty(app.Pri_Image)
[file, path] = uiputfile('*.png','命名圖片并保存到您的計算機(jī)中');
save = [path file];
if ~(isequal(file, 0) || isequal(path,0))
imwrite(app.Temp_Image,save,'png');
end
else
msgbox("操作失敗,預(yù)覽圖像為空!","錯誤","error");
end
3、清空面板
將坐標(biāo)區(qū)以及直方圖清空
??使用cla函數(shù)清空坐標(biāo)區(qū),達(dá)到清空顯示的效果,將全局變量圖片賦值為[ ]空矩陣,達(dá)到清空圖片的效果。代碼如下:
cla(app.Pri_Plot);
cla(app.Ori_Plot);
cla(app.Pri_Image);
cla(app.Ori_Image);
app.Super_Image=[];
app.Temp_Image=[];
app.Change_Image=[];
app.Count_Image=[];
4、退出程序
通過對話框提示實現(xiàn)交互性關(guān)閉程序
??使用delete函數(shù)關(guān)閉整個程序主界面實現(xiàn)退出的效果,close也能達(dá)到相同的效果,且效果更好,能關(guān)閉所有的窗口。代碼如下:
choice = questdlg('確定要退出嗎?','提示','確定','取消','取消');
switch choice
case '確定'
% delete 和 close 任選其一
delete(app.UIFigure); %退出程序
% close all; %關(guān)閉所有窗口
return;
case '取消'
return;
end
5、彩色圖像灰度化
對圖像進(jìn)行灰度化處理,并彈窗提示是否繼續(xù)進(jìn)行二值化處理
??獲取原圖像大小以及判斷通道,如果只有一個通道說明為灰度圖,則不需要變換;如果不止一個通道則進(jìn)行變換。使用rgb2gray函數(shù)將圖片轉(zhuǎn)化為灰度圖。在圖片轉(zhuǎn)化為灰度圖后可使用im2bw函數(shù)將灰度圖二值化。作業(yè)要求將彩色圖像灰度化,灰度圖像二值化,所以我在將彩色圖像灰度化后加了一個彈窗,詢問是否將圖像二值化。
??代碼如下:
if isempty(app.Temp_Image)
return;
end
%讀取原圖
app.Temp_Image = app.Super_Image;
im = imread(app.Temp_Image);
[~,~,h] = size(im); % 獲取原圖像的大小
if h==1
Grayim = im; % 如果只有一個通道說明是灰度圖像,不需要做變換
else
Grayim = rgb2gray(im);
end
imshow(Grayim,'Parent',app.Pri_Image);
app.Temp_Image = Grayim;
choice = questdlg('已將圖像灰度化,要將圖像二值化嗎?','提示','確定','取消','取消');
switch choice
case '確定'
BWim = im2bw(app.Temp_Image);%二值化
imshow(BWim,'Parent',app.Pri_Image);
app.Temp_Image = BWim;
return;
case '取消'
return;
end
6、圖像二值化
將圖像進(jìn)行二值化
??與上一點(diǎn)差不多,就少了個彈窗,這里就不放代碼和截圖了。
7、灰度變換
對圖像進(jìn)行指數(shù)變換和對數(shù)變換
??這里我是做了一個彈窗來選擇要進(jìn)行哪種變換。
??代碼如下:
if isempty(app.Temp_Image)
return;
end
%讀取原圖
app.Temp_Image = app.Super_Image;
im = imread(app.Temp_Image);
[~,~,h] = size(im); % 獲取原圖像的大小
choice = questdlg('請選擇要進(jìn)行的變換操作','灰度變換','指數(shù)變換','對數(shù)變換','');
switch choice
case '指數(shù)變換'
if h==1
Grayim = double(im);
else
Grayim = double(rgb2gray(im));
end
Grayim2 = 1.5.^(Grayim*0.070)-1;
Grayim2 = uint8(Grayim2);
imshow(Grayim2,'Parent',app.Pri_Image);
app.Temp_Image = Grayim2;
return;
case '對數(shù)變換'
if h==1
Grayim = im2double(im);
else
Grayim = im2double(rgb2gray(im));%灰度化
end
Grayim2 = 2*log(Grayim+1);
imshow(Grayim2,'Parent',app.Pri_Image);
app.Temp_Image = Grayim2;
return;
end
??實驗結(jié)果如下,從左往右依次為:提示彈窗、指數(shù)變換和對數(shù)變換。我們可以看到,對數(shù)變換圖像更亮,指數(shù)變換圖像更暗,這是因為對數(shù)函數(shù)會擴(kuò)張低灰度區(qū)域壓縮高灰度區(qū)域,因此低灰度區(qū)域細(xì)節(jié)會增強(qiáng),圖像整體會變亮,而指數(shù)函數(shù)則相反。
8、鏡像變換
對圖像進(jìn)行水平鏡像、垂直鏡像、以及水平垂直鏡像的處理文章來源:http://www.zghlxwxcb.cn/news/detail-510073.html
??將圖片每行(列)元素的順序翻轉(zhuǎn)即可達(dá)到鏡像的效果,在 MATLAB 中可使用 flip (A,dim) 函數(shù)實現(xiàn),其中 A 為需要處理的對象,dim = 1 時為行翻轉(zhuǎn),dim=2 時為列翻轉(zhuǎn)。
??MATLAB 函數(shù)官方手冊 flip (A,dim) 指路??翻轉(zhuǎn)元素順序
??代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-510073.html
if isempty(app.Temp_Image)
return
到了這里,關(guān)于【學(xué)生作業(yè)】數(shù)字圖像處理之MATLAB大作業(yè):自制圖像處理小工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!