在MATLAB使用者介面GUI上設計一個操作簡單、功能齊全的數位影像處理技術的集合,對於一些對數位影像處理原理不懂的使用者也能夠根據自己的需求處理處自己想要的數位影像。本系統GUI介面設計兩個顯示介面: 一個原資料介面,一個是處理結果介面顯示,能夠很好的展現數位影像處理結果。每一個功能的實現都是按鈕代替了每一步複雜的數位影像處理過程。
1. 主要包含兩個步驟,分別如下:
GUI人機互動介面從上到下的,程式設計從下到上的原則來實現本課題的數位影像處理系統的功能集合。
實現本系統對處理影象的讀取和儲存、復原和還原、影象剪下、影象反色、影象旋轉等修剪。設計GUI人機互動介面實現對影象新增噪聲、影象濾波、邊緣檢測等處理功能的程式。
2. 以下附上本科時代學習筆記
#基於matlab的影象處理系統設計
1、設計目的
利用matlab的GUI程式設計一個簡單的影象處理系統,可以實現影象的簡單的運算操作,實現影象的剪下、旋轉、濾波、放縮等功能,進一步熟悉matlab語言。
2、設計要求
設計程式有以下基本功能:
3、設計的matlab數位影像處理系統框架
該GUI介面包含兩個顯示介面axes1和axes2。包含讀取影象、椒鹽噪聲,乘性噪聲,高斯噪聲,儲存影象,退出系統,剪下影象,影象反色,濾波,旋轉,復原和還原等按鈕,構成了這個系統的框架。執行之後的介面顯示如下:
4、GUI各個模組功能的實現
4.1、影象的讀取
利用matlab的uigetfile獲取影象的路徑,msgbox視窗函數提示選擇影象失敗,imshow對影象的顯示。
global s %定義全域性變數,為了後面的還原儲存資料
[filename,pathname,filterindex]=...
uigetfile({'*.*';'*.bmp';'*.tif';'*.png';'*.jpg';'*.jpeg'},'select picture'); %選擇圖片路徑
str=[pathname filename]; %合成路徑+檔名
s=str;
handles.filebig=filterindex;
if filterindex==0
msgbox('選擇影象失敗!','error');
return
else
im=imread(str); %讀取圖片
end
axes(handles.axes1); %使用第一個axes
imshow(im); %顯示圖片
handles.img=im;
guidata(hObject,handles);
4.2、影象的儲存
影象儲存利用matlab的uiputfile函數和IMwrite函數進行資料的寫入。msgbox(‘引數1’,‘引數2’)實現視窗的介面。
if handles.img==0
msgbox('沒有可儲存的影象!','error');
return;
else
[filename,pathname,filterindex]=...
uiputfile({'*.bmp';'*.tif';'*.png';'*.jpg';'*.jpeg'},'save picture');%儲存圖片路徑
end
if filterindex==0
return %如果取消操作,返回
else
str=[pathname filename]; %合成路徑+檔名
axes(handles.axes2); %使用第二個axes
imwrite(handles.img,str); %寫入圖片資訊,即儲存圖片
end
程式的主要部分是通過uiputfile函數選擇影象的格式和路徑,通過imwrite函數實現影象的儲存,最後完成儲存工作。通過之後的完善,引數handles.img=0時,表示沒有影象可以儲存,考慮其中的情況修復這種情況下的系統報錯;另外filterindex=0時,按了儲存按鈕,但是沒有儲存這種情況,修復了儲存的可能性。
4.3、系統退出
clc
clear
close(gcf)
該部分利用clc清屏指令,clear清除記憶體,close(gcf)就是關閉當前視窗的指令。來實現系統的退出。
4.4、影象反色
利用反色函數imcomplement()實現影象的反色,可以反色彩色和灰色影象
global T %定義全域性變數,儲存上一個運算元據,實現復原操作
T=handles.img;
axes(handles.axes1);
imshow(handles.img);
mysize=size(handles.img);
I=imcomplement(handles.img);%還需要進一步修改。
axes(handles.axes2);
imshow(I);
handles.img=I;
guidata(hObject,handles);
效果圖如下:
4.5、影象的剪下
利用matlab的imcrop函數實現影象的剪下。
global T
T=handles.img;
if handles.filebig==0
msgbox('處理失敗,請選擇影象。','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
I=imcomplement(handles.img);%還需要進一步修改。
end
axes(handles.axes2);
imshow(I);
handles.img=I;
guidata(hObject,handles);
4.6、加入噪聲
4.6.1、椒鹽噪聲
global T
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
mysize=size(handles.img);
if numel(mysize)<3
msgbox('處理失敗,請選擇RGB影象。','error');
return;
else
prompt={'輸入椒鹽噪聲:'};
defans={'0.02'};
p=inputdlg(prompt,'input',1,defans);%prompt是提示語,input是對話方塊的標題,1是輸入方框的大小設定,defans是輸入框的預設值
p1=str2num(p{1});
f=imnoise(handles.img,'salt & pepper',p1); %由於偵錯出現各種錯誤提示,不知道什麼情況,最後發現salt&pepper之間需要空格。
end
axes(handles.axes2);
imshow(f);
handles.img=f;
guidata(hObject,handles);
4.6.2、乘性噪聲
global T
T=handles.img;
axes(handles.axes1);
imshow(handles.img);
mysize=size(handles.img);
if numel(mysize)<3
msgbox('處理失敗,請選擇RGB影象。','error');
return;
else
prompt={'輸入乘性噪聲:'};
defans={'0.02'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
f=imnoise(handles.img,'speckle',p1);%speckle
end
axes(handles.axes2);
imshow(f);
handles.img=f;
guidata(hObject,handles);
4.6.3、高斯噪聲
global T
T=handles.img;
mysize=size(handles.img);
if numel(mysize)<3
msgbox('處理失敗,請選擇RGB影象。','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
prompt={'輸入高斯噪聲1:','輸入高斯噪聲2:'};
defans={'0','0.02'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
p2=str2num(p{2});
f=imnoise(handles.img,'gaussian',p1,p2);
end
axes(handles.axes2);
imshow(f);
handles.img=f;
guidata(hObject,handles);
4.7、邊緣檢測
global T
if handles.filebig==0
msgbox('請先輸入影象!','error');
return;
else
T=handles.img;
axes(handles.axes1);
imshow(handles.img);
str=get(hObject,'string'); %拿到所選按鈕的名稱
axes(handles.axes2); %使用第二個axes
mysize=size(handles.img);
%判斷讀取的影象是彩色還是灰色圖片,若是彩色圖片進行灰度化,進一步進行邊緣檢測
if numel(mysize)>2
us=rgb2gray(handles.img);
else
us=handles.img;
end
switch str %選擇語句
case'Graying' %點選原圖按鈕
BW=us;
imshow(BW); %顯示原圖
handles.img=BW;
guidata(hObject,handles);
case'Roberts' %點選Roberts邊緣檢測按鈕
BW=edge(us,'roberts');
imshow(BW);
handles.img=BW;
guidata(hObject,handles);
case'Sobel' %點選Sobel邊緣檢測按鈕
BW=edge(us,'sobel');
imshow(BW);
handles.img=BW;
guidata(hObject,handles);
case'Prewitt' %點選Prewitt邊緣檢測按鈕
BW=edge(us,'prewitt');
imshow(BW);
handles.img=BW;
guidata(hObject,handles);
case'Log' %點選Log邊緣檢測按鈕
BW=edge(us,'log');
imshow(BW);
handles.img=BW;
% handles.xiao=0;%........................................計數操作
guidata(hObject,handles);
case'Canny' %點選Canny邊緣檢測按鈕
BW=edge(us,'canny');
imshow(BW);
handles.img=BW;
guidata(hObject,handles);
end;
end;
4.8、影象旋轉
global T
if handles.filebig==0
msgbox('請輸入函數影象!','error');
return;
else
T=handles.img;
prompt={'輸入旋轉角度:'};
defans={'30'};
p=inputdlg(prompt,'input',1,defans);%prompt是提示語,input是對話方塊的標題,1是輸入方框的大小設定,defans是輸入框的預設值
if ~isempty(p)%判斷inputdlg是否有返回值。進一步判斷
p1=str2num(p{1});
else
return;
end
end
handles.im1=imrotate(handles.img,p1,'nearest','crop');%crop
% guidata(hObject,handles);
axes(handles.axes2);
imshow(handles.im1);
handles.img=handles.im1;
guidata(hObject,handles);%需要儲存資料不然後面的操作無法讀取原來的資料,實現不了還原復原操作。
4.9、影象濾波操作
4.9.1、平滑濾波
按鈕可以識別系統是否含有可操作影象,可以進行提示,不會發生錯誤。
global T
if handles.filebig==0 %判斷系統是否有處理檔案
msgbox('請輸入函數影象!','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
axes(handles.axes2);
prompt={'請輸入模板維度:'};
defans={'3'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
h1=fspecial('average',[p1 p1]);
I=imfilter(handles.img,h1);%線性空間濾波
end
imshow(I);
handles.img=I;
guidata(hObject,handles);
4.9.2、銳化濾波
4.9.2.1、sobel濾波
global T
if handles.filebig==0
msgbox('請輸入函數影象!','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
axes(handles.axes2);
h=fspecial('sobel');
g2=imfilter(handles.img,h);
g3=imadd(g2,handles.img);
end
imshow(g3);
handles.img=g3;
guidata(hObject,handles);
4.9.2.2、prewitt濾波
global T
if handles.filebig==0
msgbox('請輸入函數影象!','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
axes(handles.axes2);
h=fspecial('prewitt');
g2=imfilter(handles.img,h);
g3=imadd(g2,handles.img);
end
imshow(g3);
handles.img=g3;
guidata(hObject,handles);
4.9.2.3、laplacian濾波
global T
if handles.filebig==0
msgbox('請輸入函數影象!','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
T=handles.img;
axes(handles.axes2);
h=fspecial('laplacian');
g2=imfilter(handles.img,h);
g3=imadd(g2,handles.img);
imshow(g3);
end
handlse.img=g3;
guidata(hObject,handles);
5.0、系統復原與還原
系統的還原是通過之前定義的全域性變數s,通過按鈕按鍵,從新讀取最原始的資料,顯示在axes2上,實現還原功能。
global s
if handles.filebig==0
msgbox('請輸入函數影象!','error');
return;
else
im=imread(s);
end
axes(handles.axes2);
imshow(im);
handles.img=im;
guidata(hObject,handles);
系統復原實現是通過全域性變數,記錄上一次操作結果,對上一次操作結果的顯示,實現對操作的復原功能。
global T
if handles.filebig==0
msgbox('請輸入函數影象!','error');
return;
else
handles.img=T;
end
axes(handles.axes2);
imshow(T);
guidata(hObject,handles);
6、學習總結與歸納
這次GUI影象處理系統的學習,主要是為了更好地學習matlab操作,對matlab有更好地瞭解。一開始確實很迷茫,不知道用matlab軟體該怎麼來做這個簡易的系統,在查詢了資料之後大概瞭解了怎麼來處理這個問題的大概思路,就是利用matlab的GUI人機互動介面來實現這個面板,在每個按鈕下面來實現每一個功能。先從上往下設計,程式是從下往上設計的思路,最後來完成這個功能集合。在實驗的過程中,遇到了很多的問題,就是因為不熟悉matlab,自己有好多想法但是不知道怎麼來實現,然後我自己還的去查詢、複習那些呼叫函數。
ANSWER=inputdlg(PORMPT)建立一個對話方塊,對cell array名字在pormpt裡面定義。彈出一個名字為potmpt的cell array,輸入值返回到answer。
ANSWER = inputdlg(PROMPT,NAME) specifies the title for the dialog.
ANSWER = inputdlg(PROMPT,NAME,NUMLINES) specifies the number of lines for each answer in NUMLINES.
ANSWER = inputdlg(PROMPT,NAME,NUMLINES,DEFAULTANSWER) specifies the default answer to display for each PROMPT.Default Answer must be a cell array of strings.
下面例子是有兩個輸入框,名字叫‘name’,‘只有一行輸入框’,初始值在defaultanswer中定義。最後全部返回到answer中,實現資料傳遞。
prompt={'Enter the matrix size for x^2:','Enter the colormap name:'};
name='Input for Peaks function';
numlines=1;
defaultanswer={'20','hsv'};
answer=inputdlg(prompt,name,numlines,defaultanswer);
這是一個用於很好的人機交流介面,可以讓使用者自己很好的偵錯自己的產品視窗。
在各個按鈕功能完成之後,進行了程式bug的修復,當按鈕沒有傳遞資料時出現的報錯進行了修復完善。之前系統不能還原和復原,還不能對已經處理的影象再進行處理。在後面的修復中,通過全域性變數T和s來分別儲存上次操作變數,和最初讀入影象來實現了系統操作的復原和還原。可以重複累加的對影象進行處理。這樣系統功能就更加完善。
缺陷在於系統任然有的時候會出現報錯,對剪下個位元素影象矩陣時出現報錯。個別情況還原出現報錯,還未能找到原因。不能實現復原多級,應該利用多個全域性變數儲存操作影象就能實現復原多級功能,這還有待修復。