第一篇:matlab實踐報告
MATLAB 實踐 課程設計
學生姓名:
學
號:
專業班級:
指導教師:
二○一二
年
六 月 二十 日1
《》
目錄
1.設計目的???????????????????3 2.題目分析???????????????????3 3.總體設計???????????????????3 4.具體設計???????????????????4 5.結果分析???????????????????32 6.心得體會???????????????????33 6.附錄代碼???????????????????35
1、設計目的
綜合運用MATLAB工具箱實現圖像處理的GUI程序設計。
2、題目分析
1.課程設計的基本要求
1)熟悉和掌握MATLAB 程序設計方法 2)掌握MATLAB GUI 程序設計 3)學習和熟悉MATLAB圖像處理工具箱
4)學會運用MATLAB工具箱對圖像進行處理和分析 2. 課程設計的內容
學習MATLAB GUI程序設計,利用MATLAB圖像處理工具箱,設計和實現自己的Photoshop。要求:按照軟件工程方法,根據需求進行程序的功能分析和界面設計,給出設計詳細說明。然后按照自己擬定的功能要求進行程序設計和調試。
1)圖像的讀取和保存。
2)設計圖形用戶界面,讓用戶能夠對圖像進行任意的亮度和對比度變化調整,顯示和對比變換前后的圖像。
3)設計圖形用戶界面,讓用戶能夠用鼠標選取圖像感興趣區域,顯示和保存該選擇區域。
4)編寫程序通過最近鄰插值和雙線性插值等算法將用戶所選取的圖像區域進行放大和縮小整數倍的操作,并保存,比較幾種插值的效果。
5)圖像直方圖統計和直方圖均衡,要求顯示直方圖統計,比較直方圖均衡后的效果。
6)能對圖像加入各種噪聲,并通過幾種濾波算法實現去噪并顯示結果。7)設計圖形用戶界面,讓用戶能夠對圖像進行偽彩色和真彩色處理。8)能夠對圖像進行一些特效處理,如底片,浮雕,倒影等
3、總體設計
這次的設計的功能按鈕主要是菜單部分,菜單功能上的偽彩色、真彩色增強和各種特效算是比較有特色的地方,其他的功能是一些圖像處理的基本實現大多可以通過Matlab自帶的一些現成函數來調用以實現,關鍵是要注意它的使用語法和支持的圖像類型。
具體的菜單功能和面板設計如下圖所示:
4、具體設計 4.1 菜單的設計 通過Menu Editor創建如下菜單
4.2 圖像的讀取和保存
1)利用matlab中 “ uigetfile”、“imread” “imshow”實現圖像文件的讀取與顯示:
[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'載入圖像');if isequal(filename,0)lisequal(pathname,0)errordlg('沒有選中文件','出錯');return;else
file=[pathname,filename];global S %設置一個全局變量S,保存初始圖像路徑,以便之后的還原操作
S=file;x=imread(file);set(handles.axes1,'HandleVisibility','ON');axes(handles.axes1);imshow(x);set(handles.axes1,'HandleVisibility','OFF');axes(handles.axes2);imshow(x);handles.img=x;guidata(hObject,handles);End 程序關鍵部分:
通過[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'載入圖像')選擇相應路徑打開的圖像;通過file=[pathname,filename];x=imread(file);讀取選中的圖像;最后,通過imshow(x)在顯示區域上顯示圖像。2)
利用“uiputfile”、“imwrite”函數實現圖像文件的保存。
[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存圖像文件','untitled.jpg');if ~isequal([sfilename,sfilepath],[0,0])sfilefullname=[sfilepath ,sfilename];imwrite(handles.img,sfilefullname);else
msgbox('你按了取消鍵','保存失敗');end
程序關鍵部分:
通[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存圖像文件','untitled.jpg')選擇圖像文件保存的路徑與格式;然后,通過sfilefullname=[sfilepath ,sfilename];imwrite(handles.img,sfilefullname);實現對圖像的保存。3)程序的退出 clc;close all;close(gcf);clear;4.3 對圖像進行任意的亮度和對比度變化調整,顯示和對比變換前后的圖像。1)亮度調節
%亮度調節
axes(handles.axes2);prompt={'調整倍數'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});y=imadjust(handles.img,[ ], [ ],p1);%亮度調節
imshow(y);handles.img=y;guidata(hObject,handles);
2)對比度調節 %對比度調節
axes(handles.axes2);prompt={'調整倍數'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});7
y=immultiply(handles.img,p1);%對比度調節
imshow(y);handles.img=y;guidata(hObject,handles);
4.4 用鼠標選取圖像感興趣區域,顯示和保存該選擇區域。
通過imcrop(x)函數來實現對圖片某一區域的截取,截取的圖片在右框中顯示。結合“保存為?”,可把截圖處理后的圖片保存在指定路徑。%截圖 global T axes(handles.axes2);T=getimage;x=imcrop(handles.img);%截圖 imshow(x);handles.img=x;guidata(hObject,handles);
4.5 圖像轉化為灰度圖像。
利用rgb2gray(X)函數對其他圖像進行灰度圖像的轉化。%灰度變換 global T axes(handles.axes2);T=getimage;x=rgb2gray(handles.img);%灰度變換
imshow(x);handles.img=x;
guidata(hObject,handles);
4.6對圖像進行放大和縮小整數倍的操作。
通過imresize(X,n,mode)函數對圖像X進行放大或者縮小。N放大縮小倍數,mode為采用的方式,通過處理后可發現保存的圖片的比原圖放大了(縮小了)。1)放大
%最近鄰插值法放大
global T axes(handles.axes2);T=getimage;prompt={'輸入放大倍數:'};defans={''};p=inputdlg(prompt,'輸入放大倍數',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'nearest');%最近鄰插值法放大 imshow(y);handles.img=y;guidata(hObject,handles);%雙線性插值法放大 global T axes(handles.axes2);T=getimage;prompt={'輸入放大倍數:'};defans={''};p=inputdlg(prompt,'輸入放大倍數',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'bilinear');%雙線性插值法放大 imshow(y);handles.img=y;guidata(hObject,handles);
2)縮小
%最近鄰插值法縮小 global T axes(handles.axes2);T=getimage;prompt={'輸入放大倍數:'};defans={''};p=inputdlg(prompt,'輸入放大倍數',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'nearest');%最近鄰插值法縮小 imshow(y);handles.img=y;guidata(hObject,handles);%雙線性插值法縮小 global T axes(handles.axes2);T=getimage;prompt={'輸入放大倍數:'};defans={''};p=inputdlg(prompt,'輸入放大倍數',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'bilinear');%雙線性插值法縮小 imshow(y);handles.img=y;guidata(hObject,handles);4.7圖像直方圖統計和直方圖均衡。(1)通過imhist函數實現直方圖統計。
由于imhist函數只能對灰度圖像進行直方圖統計,所以要先判斷圖像是彩色圖像還是灰度圖像,分兩種情況處理。global T axes(handles.axes2);T=getimage;s=handles.img;if isrgb(s)%對灰度圖像和彩色圖像分別處理 for k=1:3 x(:,:,k)=imhist(s(:,:,k));%直方圖統計
end else
x=imhist(handles.img);%直方圖統計 end
x1=x(1:10:256);horz=1:10:256;bar(horz,x1);axis([0 255 0 15000]);set(handles.axes2,'xtick',0:50:255);set(handles.axes2,'ytick',0:2000:15000);
(2)通過histeq(X)函數實現直方圖均衡。
因為此函數只能對灰度圖像進行直方圖均衡故應先將彩圖轉為灰度圖像所以要先判斷圖像是彩色圖像還是灰度圖像,分兩種情況處理。%直方圖均衡化 global T axes(handles.axes2);T=getimage;s=handles.img;if isrgb(s)%對灰度圖像和彩色圖像分別處理 a=histeq(s(:,:,1));%對每一種基色直方圖均衡 b=histeq(s(:,:,2));c=histeq(s(:,:,3));k(:,:,1)=a;
k(:,:,2)=b;k(:,:,3)=c;imshow(k);else
y=histeq(s);%對灰度圖像直方圖均衡
imshow(y);handles.img=y;guidata(hObject,handles);end
4.8撤銷和還原
1)撤銷上一步的操作,通過設一個全局變量T保存是上一次操作后的圖像。%撤銷
axes(handles.axes2);global T imshow(T);handles.img=T;guidata(hObject,handles);2)通過一個全局變量保存原始圖像路徑,在需要還原至原始圖像時,重新讀取該全局變量即可。%還原
global S axes(handles.axes2);y=imread(S);
f=imshow(y);handles.img=y;guidata(hObject,handles);4.9邊緣采集 %邊緣采集 global T axes(handles.axes2);T=getimage;s=handles.img;if isrgb(s)%對灰度圖像和彩色圖像分別處理 for k=1:3 f(:,:,k)=edge(s(:,:,k),'sobel');% 用sobel算子,還有roberts算子,prewitt算子等 end else
f=edge(s,'sobel');end
imshow(f);handles.img=f;guidata(hObject,handles);
4.9加入各種噪聲 1)高斯噪聲
高斯噪聲是指它的概率密度函數服從高斯分布的一類噪聲。高斯噪聲是一種隨機噪聲,它完全由其時變平均值和兩瞬時的協方差函數來確定。%高斯噪聲
axes(handles.axes2);y=imnoise(handles.img,'gaussian',0,0.05);%加高斯噪聲 imshow(y);handles.img=y;guidata(hObject,handles);
2)椒鹽噪聲
椒鹽噪聲是由圖像傳感器,傳輸信道,解碼處理等產生的黑白相間的亮暗點噪聲。椒鹽噪聲往往由圖像切割引起。去除脈沖干擾級椒鹽噪聲最常用的算法是中值濾波。%?椒鹽噪聲
axes(handles.axes2);y=imnoise(handles.img,'salt & pepper',0.08);%加椒鹽噪聲
imshow(y);handles.img=y;guidata(hObject,handles);
3)斑點噪聲
斑點噪聲是SAR成像系統的一大特色,源自基本分辨單元內地物的隨機散射,在圖像上表現為信號相關(如在空間上相關)的小斑點,它既降低了圖像的畫面質量,又嚴重影響圖像的自動分割、分類、目標檢測以及其它定量專題信息的提取。SAR斑點噪聲的抑制可通過非相干多視處理,也可使用空間域濾波實現。%斑點噪聲
axes(handles.axes2);y=imnoise(handles.img,'speckle',0.04);%加斑點噪聲 imshow(y);handles.img=y;guidata(hObject,handles);14
4)泊松噪聲 %泊松噪聲
axes(handles.axes2);y=imnoise(handles.img,'poisson');%加泊松噪聲 imshow(y);handles.img=y;guidata(hObject,handles);
4.10濾波 1)高通濾波
高通濾波是只對低于某一給定頻率以下的頻率成分有衰減作用,而允許這個截止頻率以上的頻率成分通過,并且沒有相位移的濾波過程。主要用來消除低頻噪聲,保留高頻部分。圖像中的邊緣或線條與圖像頻譜中的高頻分量相對應,因為采用高通濾波器讓高頻成分順利通過,可以使圖像的邊緣或線條更加清楚,從而識相圖像的銳化。%高通濾波
axes(handles.axes2);x=(handles.img);f=double(x);% 數據類型轉換,matlab不支持圖像的無符號整型的計算 k=fft2(f);% 傅里葉變換 g=fftshift(k);% 轉換數據矩陣 [M,N]=size(g);nn=2;d0=5;%截止頻率5 m=fix(M/2);n=fix(N/2);15
for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2);% 計算高通濾波器傳遞函數
if d<=d0 h=0;else h=1;end
result(i,j)=h*g(i,j);end end
result=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3);handles.img=y3;guidata(hObject,handles);% 顯示濾波處理后的圖像
2)低通濾波
圖像的邊緣以及噪聲干擾在圖像的頻域上對應于圖像傅里葉變換中的高頻部分,而圖像的背景區則對應于低頻部分,因此可以用頻域低通濾波法去除圖像的高頻部分,以去掉噪聲使圖像平滑。對于低通濾波器截止頻率的不同,會發生不同程度的“振鈴”現象,同時圖像變模糊了。截止頻率月底,濾除噪聲越徹底,高頻分量損失越嚴重,但圖像就越模糊。%低通濾波器
axes(handles.axes2);y1=handles.img;f=double(y1);% 數據類型轉換,matlab不支持圖像的無符號整型的計算 g=fft2(f);% 傅里葉變換 g=fftshift(g);% 轉換數據矩陣
[M,N]=size(g);nn=2;%二階巴特沃斯低通濾波器 d0=50;%截止頻率50 m=fix(M/2);n=fix(N/2);for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2);h=1/(1+0.414*(d/d0)^(2*nn));% 計算低通濾波器傳遞函數 result(i,j)=h*g(i,j);end end
result=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3);% 顯示處理后的圖像 handles.img=y3;guidata(hObject,handles);
3)中值濾波
中值濾波是抑制噪聲的非線性處理方法。給定一個濾波窗口,對于二維圖像,窗口形狀可以使矩形,圓形及十字形等,對于位于中間位置的那個數值稱為這n個數值的中值。中值濾波的算法運算簡單,易于實現,而且能較好地保護邊界,但有時會失掉圖像中的細線和小塊的目標區域。%中值濾波
axes(handles.axes2);a=handles.img;if isrgb(a)%對灰度和彩色圖像分別處理
for k=1:3 y(:,:,k)=medfilt2(a(:,:,k));%中值濾波
end
else
y=medfilt2(a);%中值濾波 end
imshow(y);handles.img=y;guidata(hObject,handles);
4.11圖像變換 1)傅里葉變換
為了得到圖像的頻譜圖,先要對數據進行傅里葉變換,用fft2函數對二維數據進行快速傅里葉變換,同時為了更好的觀察頻譜圖,需要把fft2變換后的數據進行平移,利用fftshift函數,把快速傅里葉變換的DC 組件移到光譜中心。這樣圖像能量的低頻成分將集中到頻譜中心,圖像上的邊緣、線條細節信息等高頻成分將分散在圖像頻譜的邊緣。%傅里葉變換
axes(handles.axes2);a=handles.img;if isrgb(a)m=fft2(a(:,:,1));%對圖像執行二維傅里葉變換 y=fftshift(m);%使低頻能量集中在中心位置 else
m=fft2(a);%對圖像執行二維傅里葉變換 y=fftshift(m);%使低頻能量集中在中心位置 end
imshow(log(abs(y)),[]);%使用對數使低頻部分顯示效果更明顯
2)離散余弦變換
傅里葉變化的一個最大問題是:它的參數都是復數,在數據的描述上相當于實數的兩倍,不易計算,因此希望有一種能達到相同功能但數據量有不大的變換,在這個思想的指導下,產生了離散余弦變換。%離散余弦變換 global T axes(handles.axes2);T=getimage;a=handles.img;gray=rgb2gray(a);d=dct2(gray);%對圖像進二維行離散余弦變換
imshow(log(abs(d)),[]);%使用對數使低頻部分顯示效果更明顯
3)Radon變換
Radon函數計算指定方向上圖像矩陣的投影,計算一定方向上平行光束的線積分。光線間隔1個象素單位。為了表示圖像,radon變換通過圍繞圖像中心旋轉光源來從不同角度獲得圖像的平行光投影。%Radon變換 global T axes(handles.axes2);theta=0:1:180;%對每個角度做radon變換處理 [r,xp]=radon(T,theta);%Radon變換
imagesc(theta,xp,r);xlabel('degrees');%為x軸做標注 colorbar;%顯示顏色條
4.12圖像增強 1)偽彩色增強
對于灰度圖像,人眼分辨的灰度級只有十幾到二十幾,而對不同的亮度和色彩圖像則可以達到幾百甚至上千,因此偽彩色增強是將一個波段或單一的黑白圖像變換為彩色圖像,從而把人眼不能區分的微小的灰度差別顯示為明顯的色彩差異,更便于解譯和提取有用信息。
偽彩色增強的方法主要有以下三種:亮度切割技術,灰度彩色變換,頻域濾波法。
我采用的是亮度切割技術,亮度切割技術是偽彩色增強中最簡單的一種方法,它是對圖像亮度范圍進行分割,使一定亮度間隔對應于某一顏色。對于切割平面以下的分配一中顏色,平面以上的再分配一種顏色。這樣,便可以把一幅灰度圖像變成一幅偽彩色圖像,此法比較直觀簡單,缺點使變換出的彩色數目有限而且顏色生硬不夠調和,量化噪聲大。%偽彩色增強 global T axes(handles.axes2);T=getimage;a=handles.img;c=zeros(size(a));%a為原灰度圖像矩陣
pos=find(a<100);%找到灰度值小于100的 c(pos)=a(pos);b(:,:,3)=c;%變為藍色
c=zeros(size(a));%a為原灰度圖像矩陣
pos=find((a>=100)&(a<230));%找到灰度值大于100小于230的 c(pos)=a(pos);b(:,:,2)=c;%變為綠色
c=zeros(size(a));%a為原灰度圖像矩陣
pos=find(a>=230);%找到灰度值大于230的c(pos)=a(pos);b(:,:,1)=c;%變為紅色
b=uint8(b);axes(handles.axes2);imshow(b);handles.img=b;guidata(hObject,handles);
2)真彩色增強
真彩色增強時從彩色到彩色的一種變換。通過一定的映射函數變換成新的三基色分量,彩色合成使得增強圖像中各目標呈現出與原圖像不同的彩色。通過真彩色增強我們可以達到變換圖像引起人們的特別關注,以及通過人眼對不同顏色的靈敏度的不同,使景物呈現出與人眼色覺相匹配的顏色,以提高人眼對目標的分辨力。%真彩色增強 global T axes(handles.axes2);T(:,:,1)=immultiply(T(:,:,1),0.3);%對R基色每個元素乘以0.3 T(:,:,2)=immultiply(T(:,:,2),0.2);%對G基色每個元素乘以0.2 T(:,:,3)=immultiply(T(:,:,3),0.5);%對B基色每個元素乘以0.5 axes(handles.axes2);imshow(T);handles.img=T;guidata(hObject,handles);21
4.12圖像翻轉 1)上下翻轉 %上下翻轉 global T axes(handles.axes2);T=getimage;a=handles.img;if isrgb(a)%對灰度和彩色圖像分別處理 for k=1:3 y(:,:,k)=flipud(a(:,:,k));end else
y=flipud(a);end
imshow(y);handles.img=y;guidata(hObject,handles);
2)左右翻轉 %左右翻轉
global T %左右鏡像 axes(handles.axes2);T=getimage;a=handles.img;if isrgb(a)%對灰度和彩色圖像分別處理
for k=1:3 y(:,:,k)=fliplr(a(:,:,k));%左右翻轉 end else
y=fliplr(a);%左右翻轉 end
imshow(y);handles.img=y;guidata(hObject,handles);
3)任意角度翻轉 %任意角度翻轉 global T axes(handles.axes2);T=getimage;prompt={'旋轉角度:'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});f=imrotate(handles.img,p1,'bilinear','crop');imshow(f);handles.img=f;guidata(hObject,handles);
4.13特效效果 1)底片效果
通過f=imcomplement(handles.img);實現圖像取反,形成底片效果。%底片效果 global T axes(handles.axes2);T=getimage;f=imcomplement(handles.img);%圖像取反 imshow(f);handles.img=f;guidata(hObject,handles);
2)運動模糊 %運動模糊 global T global S axes(handles.axes2);S=fspecial('motion',28,15);T=imfilter(handles.img,S,'circular','conv');imshow(T)handles.img=T;guidata(hObject,handles);24
3)浮雕效果
實現圖像浮雕效果的一般原理是,將圖像上每個像素點與其對角線的像素點形成差值,使相似顏色值淡化,不同顏色值突出,從而產生縱深感,達到浮雕的效果。%浮雕效果 global T axes(handles.axes2);T=getimage;a=handles.img;r=a(:,:,1);%提取紅色分量表示的圖像 g=a(:,:,2);%提取綠色分量表示的圖像 b=a(:,:,3);%提取藍色分量表示的圖像 m = size(a,1);n = size(a,2);for i=3:m-2 for j=3:n-2 rr(i,j)=0.25*r(i-1,j-1)+0.25*r(i-2,j-2)+0.25*r(i,j)+0.25*r(i+1,j+1)-1.0*r(i+2,j+2)+128;gg(i,j)=0.25*r(i-1,j-1)+0.25*g(i-2,j-2)+0.25*g(i,j)+0.25*g(i+1,j+1)-1.0*g(i+2,j+2)+128;bb(i,j)=0.25*b(i-1,j-1)+0.25*b(i-2,j-2)+0.25*b(i,j)+0.25*b(i+1,j+1)-1.0*b(i+2,j+2)+128;end end
A(:,:,1)=rr;A(:,:,2)=gg;A(:,:,3)=bb;axes(handles.axes2);imshow(A)
4)馬賽克
一般來說,圖片的每個一細節都是由一個小的像素塊組成的,如果將其無限放大,每個像素塊就會很明顯地表現出來,就是我們說的馬賽克。馬賽克算法很簡單,就是把一張圖片分割成若干個val * val像素的小區塊(可能在邊緣有零星的小塊,但不影響整體算法,val越大,馬賽克效果越明顯),每個小區塊的顏色都是相同的。而利用Matlab中的放大和縮小函數imresize,可以方便的實現圖像的馬賽克效果。具體方法為,首先將圖片縮小到原圖片大小的1/5,再將圖片放大五倍還原到原來的大小。由于圖片縮小后,部分像素值會丟失,再次放大時就會出現模糊現象,即為馬賽克。%馬賽克 pix_grp = 15;global T axes(handles.axes2);T=getimage;a=handles.img;height = size(a,1);width = size(a,2);mosaic = imresize(a,[floor(height/pix_grp)floor(width/pix_grp)]);%B = imresize(A, [numrows numcols])將圖像A放大,numrows和numcols分別指定目標圖像的高度和寬度
mosaic = imresize(mosaic,[height width],'nearest');a=mosaic;imshow(a);
5)霧化效果
設想有一塊透明的玻璃,朝上面哈幾口氣,然后將玻璃放到一張圖片上,得到的圖像效果就是霧化效果。下面來分析原理從而推導出算法。
玻璃上面哈氣后,有很多小水滴小水汽之類的,形狀不規則,因此發生光折射,由于水滴的不規則性,發生折射也是不規則的,也就是折射光的折射角不確定,但是肯定有個范圍,假設有像素A(i,j),(i和j分別表示橫坐標和縱坐標),折射后一定幾率在A(i+d,j+d)處,(-k 對每個像素A(i,j)進行處理,用其周圍一定范圍內隨機點A(i+d,j+d),(-k rr(i,j)=r(di,dj);%將原像素點用隨機像素點代替 gg(i,j)=g(di,dj);bb(i,j)=b(di,dj); end end A(:,:,1)=rr;A(:,:,2)=gg;A(:,:,3)=bb;imshow(A) 6)倒影效果 對圖像的美化過程中,常常需要制作倒影效果,倒影效果可以更好的展現風景圖片和建筑物圖片的立體效果,達到讓欣賞者賞心悅目的效果。對圖像進行倒影處理的基本思路是:將原圖像A壓縮為原來大小的一半,壓縮后的圖像旋轉180度后做左右鏡像處理,即B(i,n-j+1)=A(i,j);然后將下半部分圖像進行霧化處理,以得到更好的倒影效果,最后將上下兩部分圖像合成到一個三維數組中,使用imshow函數顯示出來就可以了 %倒影效果 global T axes(handles.axes2);T=getimage;a=handles.img;m=size(a,1);n=size(a,2);img_up=imresize(a,[floor(m*0.5),n]);%將原圖像壓縮為原來大小的一半 img_down=imrotate(a,180);%壓縮后的圖像旋轉180度 r=img_down(:,:,1);g=img_down(:,:,2);b=img_down(:,:,3);for i=1:m for j=1:n %下半部分圖像做左右鏡像 rr(i,n-j+1)=r(i,j);28 gg(i,n-j+1)=g(i,j);bb(i,n-j+1)=b(i,j);end end A(:,:,1)=rr;A(:,:,2)=gg;A(:,:,3)=bb;%A是鏡像以后的圖像 img_down=A;%倒影部分進行霧化,實現更好的倒影效果 m1=size(img_down,1);n1=size(img_down,2);r1=img_down(:,:,1);g1=img_down(:,:,2);b1=img_down(:,:,3);for i=2:m1-10 for j=2:n1-10 k=rand(1)*10;di=i+round(mod(k,33));dj=j+round(mod(k,33));rr1(i,j)=r1(di,dj);gg1(i,j)=g1(di,dj);bb1(i,j)=b1(di,dj);end end A1(:,:,1)=rr1;A1(:,:,2)=gg1;A1(:,:,3)=bb1;%霧化完成 img_down=imresize(A1,[floor(m*0.5),n]);A=[img_up;img_down];imshow(A)29 7)閾值分割 一幅圖像包括目標,背景和噪聲,怎樣從灰度圖像中取出對象物?灰度閾值法就是把圖像的灰度分成不同的等級,然后用設置灰度閾值的方法確定有意義的區域或欲分割物體的邊界。設定某一閾值T,對圖像進行二值化處理。%閾值分割 global T axes(handles.axes2);T=getimage;a=handles.img;a=double(a(:,:,1));fxy=zeros(1,256);[m,n]=size(a);for i=1:m %統計每個灰度值的個數 for j=1:n c=a(i,j);fxy(c+1)=fxy(c+1)+1;end end figure(1);plot(fxy);p1={'Input Num:'};p2={'180'};p3=inputdlg(p1,'Input Num:1~256',1,p2);p=str2num(p3{1});for i=1:m %小于閾值的為黑,大于閾值的為白 for j=1:n if a(i,j) image1(i,j)=1; end end end imshow(image1); 如果處理目標或背景內部相鄰見得灰度值是高度相關的,但處于目標和背景交界處兩邊的像素在灰度值上有很大的差別,則它的灰度直方圖基本可以看做是分別對應目標和背景的兩個單峰直方圖混合成,如上圖。我們選取波谷作為閾值分割點,就可以將目標和背景分離開了,將目標顯示出來。如下圖: 閾值分割在交通系統中的車牌識別中扮演著重要的角色,由于車牌的材料有反光的性能,當抓拍到車牌后,對圖像進行閾值分割可以得到不錯的效果。如下圖,對一幅添加了高斯噪聲的車牌進行閾值分割: 通過對灰度直方圖的統,可以看到大致的兩個波峰,取其波谷為分割點,灰度值大概在190左右,大于190的為白,小于190的為黑。 8)添加水印 為了給自己處理過的圖像添加標志,設計了添加水印的功能。該功能的主要思想是,圖像即為數組,如果要再圖像上添加水印,也就是用另一幅圖像的數據去覆蓋原圖像對應部分的數據,也就是對數組內容的替換。然后就是關于水印添加的方位了,由于添加方位的不同,所要替代的范圍的不同了。%添加水印 global T axes(handles.axes2);T=getimage;a=handles.img;[filename,pathname]=...uigetfile({'*.jpg';'*.bmp';'*.gif'},'watermark');str=[pathname filename];b=imread(str);m1=size(a,2);n1=size(a,1);m2=size(b,2);n2=size(b,1);c=a((n1-n2+1):n1,(m1-m2+1):m1,:);p1={'Input Num:'};p2={'2'}; p3=inputdlg(p1,'Input Num:1~4',1,p2);p=str2num(p3{1});if isrgb(a)&isrgb(b)switch p case 1 a(1:n2,1:m2,:)=b;%左上角 case 2 a(1:n2,(m1-m2+1):m1,:)=b;%右上角 case 3 a((n1-n2+1):n1,1:m2,:)=b;%左下角 case 4 b=imadd(imadd(c,b),-50);a((n1-n2+1):n1,(m1-m2+1):m1,:)=b;%右下角 otherwise msgbox('error,');end imshow(a);elseif isgray(a)&isgray(b)switch p case 1 a(1:n2,1:m2)=b;%左上角 case 2 a(1:n2,(m1-m2+1):m1)=b;%右上角 case 3 a((n1-n2+1):n1,1:m2)=b;%左下角 case 4 a((n1-n2+1):n1,(m1-m2+1):m1)=b;%右下角 otherwise msgbox('error');end imshow(a);else msgbox('error,the type of two pictures is mismatching');end 5、結果分析 在剛開始學習GUI時,是按著視頻教程一步一步的學習的,由于視頻介紹的比較簡單,很多相應功能都不知道相應的回調函數該怎么寫,后來就借了本圖像處理matlab版本的書籍以及上網查了一些資料,之后的設計之路就輕松多了,特別是借助于功能強大的help,相應的一些小問題基本都可以自己找出并解決。 因為讀入圖像得到的是個矩陣,所以說對圖像處理也就是對矩陣做相應的修改變換,在矩陣運算過程中遇到了幾個很典型的問題。 1)有些函數只能對灰度圖像進行操作例如左右翻轉函數,所以當圖像時彩色圖像時就要執行for k=1:3 y(:,:,k)=fliplr(a(:,:,k));%左右翻轉 end 操作 2)在實現圖像放大,縮小,亮度調整等功能時,為了方便修改,設置對話框輸入,但從對話框輸入的數其實是字符,并不是真正的整型數值,所以如果沒有對字符轉數值變化,就會得到錯誤的結果,舉個簡單的例子: a=’2’;b=2;a*b ans = 100 得到的100并不是我們所想要的4,之所以還會出結果是因為,字符2對應的ASCII碼值為50,而matlab有支持這種算法,所以會得到100的結果。 正確的做法應該是這樣: a=’2’;a=str2num(s);b=2;a*b ans = 4 所以說我們在對數據做處理的時候,一定要分清出它的類型,以免到時候查不出錯誤。 3)關于全局變量的設置,打開了一張圖片,為了能供每個功能做相應的處理,就得把圖片矩陣的屬性設置為global T,這樣做以后卻只能實現對源圖像做處理,如果要對處理過后的圖像再做處理,我們就要把處理完后的新圖像矩陣賦給源圖像,T=y,這樣就可以實現每次處理的對象都為上次處理完的圖像了。 4)??? Error using ==> * Function '*' is not defined for values of class 'uint8'.對于不同的圖像類型,圖像矩陣元素的類型也不一樣。對于真彩色圖像,數據矩陣類型是uint8;對于索引圖像,數據矩陣類型可以是double型或者uint8型;對于灰度圖像,數據矩陣類型可以是double型或者uint8型;對于二值圖像,數據矩陣類型可以是double型或者uint8型。當類型不支持時,我們可以通過強制類型轉換來得到所需數據類型,如:double(m).6、心得體會 通過這次“基于matlab的數字圖像處理”的GUI課程設計,學到了很多很多,最基本的就是重新熟悉了matlab語言,不僅僅只是在matlab編程上面有所提高和對GUI的熟悉,對數字圖像處理也有了更深刻的認識。 當我第一次拿到此次的課題時,感到有些無所適從。雖然,曾經學習過matlab的課程,在課程的考核中也取得了較好的成績,但由于對matlab的學習更多的只是停留在理論上的學習,在課時內的試驗也只是簡單的基礎性試驗,所以對matlab實際運用不是很熟練。 為此,在實踐正式開始前,我利用課余時間,重新復習了matlab教材,專門借閱了利用matlab進行圖像處理的相關教程,通過索引網絡上的相關資料,為課設做了較為充分的準備。在參考了相關材料及源程序,我對自己要做的課設內容有了進一步的了解,并對matlab的使用有了更深的體會。 首先,明白了圖像對于matlab而言就是矩陣,灰度圖像和彩色圖像對應于不同維數的矩陣,分別為二維和三維,其中三維矩陣每一位代表一種顏色。矩陣可以使實數,也可以使復數,不同的圖像矩陣的元素對應于不同的類型,有double,uint8,uint16,logic等類型。由于幾乎所有的matlab函數及其工具箱函數都可以使用double作為參數類型,不過由于64bit來表示圖像數據存儲量特別巨大,所以matlab還支持圖像數據的無符號整型存儲,所以使用時還要注意輸出數據類型的轉換。 其次,學會了要善于使用matlab中現有的函數。 最后,我們必須要明白理論指導實踐,要想實現預期的效果,必須明白它實現的機制和相應的算法,只有通過相應的理論來指導,我們才能有所創新,才能有所突破,而不只是單純的引用相應的處理函數。例如對于截圖函數,它只能是截取坐標軸內的圖像,對坐標軸意外的圖像卻不能處理,而且對于同時顯示在坐標軸上的幾張圖像,它只能處理最后顯示的那張,如果我們通過對它改進,能實現像qq截圖那樣的功能就很強大了。不過通過這次的實現,我對圖像的模式,彩色空間,存儲結構,圖像的傅里葉變換,離散余弦變換的原理,圖像的平滑和銳化的算子,直方圖的用途和直方圖均衡化原理,圖像的偽彩色和真彩色增強,以及閾值分割原理都有了更清楚的認識,也明白了它們的實現機制。還有就是,如今的GUI只能在matlab環境下運行,如果能轉化成exe 格式,就能獨立于matlab外執行了,還有很多很多新功能等待我們去探索。總體來說,此次的課程設計,還是較為滿意的。它不但鞭策著我去鞏固matlab的基礎理論知識,還提高了我對matlab的實際操作運用,使得理論與實踐相結合,為進一步學習matlab打下堅實的基礎;同時,在實踐的工程中,也讓我體會到一種努力付出并得到回報的滿足感覺。 參考書目: [1]《MATLAB實用教程》 [2] 《數字圖像處理與分析》 鄭阿奇 電子工業出版社 張弘.機械工業出版社 36 附錄: function varargout = untitled1(varargin)% UNTITLED1 M-file for untitled1.fig % UNTITLED1, by itself, creates a new UNTITLED1 or raises the existing % singleton*.% % H = UNTITLED1 returns the handle to a new UNTITLED1 or the handle to % the existing singleton*.% % UNTITLED1('CALLBACK',hObject,eventData,handles,...)calls the local % function named CALLBACK in UNTITLED1.M with the given input arguments.% % UNTITLED1('Property','Value',...)creates a new UNTITLED1 or raises the % existing singleton*.Starting from the left, property value pairs are % applied to the GUI before untitled1_OpeningFcn gets called.An % unrecognized property name or invalid value makes property application % stop.All inputs are passed to untitled1_OpeningFcn via varargin.% % *See GUI Options on GUIDE's Tools menu.Choose “GUI allows only one % instance to run(singleton)”.% % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help untitled1 % Last Modified by GUIDE v2.5 22-Jun-2012 19:36:46 % Begin initialization codeDO NOT EDIT %---Executes just before untitled1 is made visible.function untitled1_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn.% hObject handle to figure % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output;%------ function Untitled_2_Callback(hObject, eventdata, handles)% hObject handle to Untitled_2(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%保存圖像 [sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存圖像文件','untitled.jpg');if ~isequal([sfilename,sfilepath],[0,0]) sfilefullname=[sfilepath ,sfilename]; imwrite(handles.img,sfilefullname);else msgbox('你按了取消鍵','保存失敗');end %------ function Untitled_4_Callback(hObject, eventdata, handles)% hObject handle to Untitled_4(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %亮度調節 axes(handles.axes2);prompt={'調整倍數'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});y=imadjust(handles.img,[ ], [ ],p1);% 亮度調節 imshow(y); handles.img=y; guidata(hObject,handles); % ------ function Untitled_9_Callback(hObject, eventdata, handles) % hObject handle to Untitled_9(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%灰度變換 global T axes(handles.axes2); T=getimage;if isrgb(s)%對灰度圖像和彩色圖像分x=rgb2gray(handles.img);%灰度變換 別處理 imshow(x);a=histeq(s(:,:,1));%對每一種基色直handles.img=x;方圖均衡 guidata(hObject,handles);b=histeq(s(:,:,2));c=histeq(s(:,:,3));k(:,:,1)=a;% k(:,:,2)=b;------k(:,:,3)=c;imshow(k);function Untitled_15_Callback(hObject, else eventdata, handles)y=histeq(s);%對灰度圖像直方圖均衡 % hObject handle to Untitled_15(see imshow(y);GCBO)handles.img=y;% eventdata reservedto be defined in guidata(hObject,handles);a future version of MATLAB % handles structure with handles and user data(see GUIDATA)% global T------axes(handles.axes2);T=getimage;function Untitled_17_Callback(hObject, s=handles.img;eventdata, handles)if isrgb(s)%對灰度圖像和彩色圖像分別% hObject handle to Untitled_17(see 處理 GCBO)for k=1:3 % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%高斯噪聲 axes(handles.axes2);y=imnoise(handles.img,'gaussian',0,0.05);%加高斯噪聲 imshow(y);handles.img=y;guidata(hObject,handles);%------ function Untitled_22_Callback(hObject, eventdata, handles)% hObject handle to Untitled_22(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%斑點噪聲 axes(handles.axes2); y=imnoise(handles.img,'speckle',0.04);%加斑點噪聲 imshow(y); handles.img=y; guidata(hObject,handles); % ------ function Untitled_24_Callback(hObject, eventdata, handles)% hObject handle to Untitled_24(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%高通濾波 axes(handles.axes2);x=(handles.img);f=double(x);% 數據類型轉換 k=fft2(f);% 傅里葉變換 g=fftshift(k);% 轉換數據矩陣 [M,N]=size(g);nn=2;d0=5;%截止頻率5 m=fix(M/2);n=fix(N/2);for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2);% 計算高通濾波器傳遞函數 if d<=d0 h=0;else h=1;end result(i,j)=h*g(i,j);end end result=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3);handles.img=y3;guidata(hObject,handles);% 顯示濾波處理后的圖像 %------ function Untitled_28_Callback(hObject, eventdata, handles)% hObject handle to Untitled_28(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%上下翻轉 global T axes(handles.axes2);T=getimage;a=handles.img; if isrgb(a)%對灰度和彩色圖像分別處理 for k=1:3 y(:,:,k)=flipud(a(:,:,k));%上下翻轉 end else y=flipud(a);%上下翻轉 end imshow(y); handles.img=y; guidata(hObject,handles); %------ function Untitled_44_Callback(hObject, eventdata, handles)% hObject handle to Untitled_44(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%偽彩色增強 global T axes(handles.axes2);T=getimage;a=handles.img; c=zeros(size(a));%a為原灰度圖像矩陣 pos=find(a<100);%找到灰度值小于100的 c(pos)=a(pos); b(:,:,3)=c;%變為藍色 c=zeros(size(a));%a為原灰度圖像矩陣 pos=find((a>=100)&(a<230));%找到灰度值大于100小于230的 c(pos)=a(pos); b(:,:,2)=c;%變為綠色 c=zeros(size(a));%a為原灰度圖像矩陣 pos=find(a>=230);%找到灰度值大于230的c(pos)=a(pos); b(:,:,1)=c;%變為紅色 b=uint8(b); axes(handles.axes2);imshow(b); handles.img=b; guidata(hObject,handles);% ------ function Untitled_40_Callback(hObject, eventdata, handles)% hObject handle to Untitled_40(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %------ function Untitled_35_Callback(hObject, eventdata, handles)% hObject handle to Untitled_35(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%離散余弦變換 global T axes(handles.axes2);T=getimage;a=handles.img;gray=rgb2gray(a); d=dct2(gray);%對圖像進二維行離散余弦變換 imshow(log(abs(d)),[]);%使用對數使低頻部分顯示效果更明顯 % ------ function Untitled_45_Callback(hObject, eventdata, handles)% hObject handle to Untitled_45(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%雙線性插值法放大 global T axes(handles.axes2);T=getimage;prompt={'輸入放大倍數:'};defans={''};p=inputdlg(prompt,'輸入放大倍數',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'bilinear');%雙線性插值法放大 imshow(y);handles.img=y;guidata(hObject,handles); %------ function Untitled_47_Callback(hObject, eventdata, handles)% hObject handle to Untitled_47(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%雙線性插值法縮小 global T axes(handles.axes2);T=getimage; prompt={'輸入放大倍數:'};defans={''}; p=inputdlg(prompt,'輸入放大倍數',1,defans); p1=str2num(p{1}); y=imresize(handles.img,p1,'bilinear');%雙線性插值法縮小 imshow(y); handles.img=y;guidata(hObject,handles); %------ function Untitled_50_Callback(hObject, eventdata, handles)% hObject handle to Untitled_50(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%撤銷 axes(handles.axes2);global T imshow(T);handles.img=T;guidata(hObject,handles); % ------ function Untitled_54_Callback(hObject, eventdata, handles)% hObject handle to Untitled_54(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) [sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存圖像文件','untitled.jpg');if ~isequal([sfilename,sfilepath],[0,0]) sfilefullname=[sfilepath ,sfilename]; imwrite(handles.img,sfilefullname);else msgbox('你按了取消鍵','保存失敗');end %------function uipushtool5_ClickedCallback(hObject, eventdata, handles)% hObject handle to uipushtool5(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)axes(handles.axes2);p1=str2num('5'); y=imresize(handles.img,p1,'nearest');%最近鄰插值法放大 imshow(y); handles.img=y; guidata(hObject,handles); %---Executes on button press in pushbutton4.function pushbutton4_Callback(hObject, eventdata, handles)% hObject handle to pushbutton4(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)axes(handles.axes2);p1=str2num('0.2');y=imresize(handles.img,p1,'nearest');%最近鄰插值法放大 imshow(y);handles.img=y;guidata(hObject,handles); %------function uitoggletool1_ClickedCallback(hObject, eventdata, handles)% hObject handle to uitoggletool1(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) global S axes(handles.axes2);%還原 y=imread(S);f=imshow(y);handles.img=y; guidata(hObject,handles);% ------ function Untitled_57_Callback(hObject, eventdata, handles)% hObject handle to Untitled_57(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%Radon變換 global T axes(handles.axes2);theta=0:1:180;%對每個角度做radon變換處理 [r,xp]=radon(T,theta);%Radon變換 imagesc(theta,xp,r);xlabel('degrees');%為x軸做標注 colorbar;%顯示顏色條 %------ function Untitled_59_Callback(hObject, eventdata, handles)% hObject handle to Untitled_59(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%還原 global S axes(handles.axes2);y=imread(S);f=imshow(y);handles.img=y; guidata(hObject,handles); %---Executes during object creation, after setting all properties.function figure1_CreateFcn(hObject, eventdata, handles) % hObject handle to figure1(see GCBO)% eventdata reservedhandles not created until after all CreateFcns called %---Executes during object creation, after setting all properties.%添加背景圖片 im=axes('units','normalized','position',[0 0 1 1]); uistack(im,'down');II=imread('9.jpg');image(II); colormap gray; set(im,'handlevisibility','off','visible',off); ------%------function Untitled_62_Callback(hObject, eventdata, handles)function Untitled_61_Callback(hObject, % hObject handle to Untitled_62(see eventdata, handles)GCBO)% hObject handle to Untitled_61(see % eventdata reservedto be defined in % handles structure with handles and a future version of MATLAB user data(see GUIDATA)% handles structure with handles and %馬賽克 user data(see GUIDATA).pix_grp = 15;%浮雕效果 global T global T axes(handles.axes2);axes(handles.axes2);T=getimage;T=getimage;a=handles.img;a=handles.img;height = size(a,1);r=a(:,:,1);%提取紅色分量表示的圖像 width = size(a,2);g=a(:,:,2);%提取綠色分量表示的圖像 mosaic = b=a(:,:,3);%提取藍色分量表示的圖像 imresize(a,[floor(height/pix_grp)m = size(a,1);floor(width/pix_grp)]);n = size(a,2);%B = imresize(A, [numrows numcols])將for i=3:m-2 圖像A放大,numrows和numcols分別指定目for j=3:n-2 標圖像的高度和寬度 rr(i,j)=0.25*r(i-1,j-1)+0.25*r(i-2,j-mosaic = imresize(mosaic,[height 2)+0.25*r(i,j)+0.25*r(i+1,j+1)-1.0*r(width],'nearest');i+2,j+2)+128;a=mosaic;gg(i,j)=0.25*r(i-1,j-1)+0.25*g(i-2,j-imshow(a);2)+0.25*g(i,j)+0.25*g(i+1,j+1)-1.0*g(i+2,j+2)+128;bb(i,j)=0.25*b(i-1,j-1)+0.25*b(i-2,j-% 2)+0.25*b(i,j)+0.25*b(i+1,j+1)-1.0*b(------i+2,j+2)+128;end function Untitled_63_Callback(hObject, end eventdata, handles)A(:,:,1)=rr;% hObject handle to Untitled_63(see A(:,:,2)=gg;GCBO)A(:,:,3)=bb;% eventdata reserved-to be defined in axes(handles.axes2);a future version of MATLAB imshow(A)% handles structure with handles and user data(see GUIDATA) %霧化效果 global T % axes(handles.axes2); MATLAB實踐報告 2016/2017學年 第一學期 專 業: 電氣工程及其自動化 班 級: 學 號: 姓 名: 2017年 2 月 目錄 第1章 引言.....................................................................................................................................1 第2章MATLAB功能介紹............................................................................................................2 2.1 MATLAB功能特性...........................................................................................................2 2.1.1主要功能..................................................................................................................2 2.1.2 MATLAB產品系列重要功能................................................................................2 2.2MATLAB優勢特點............................................................................................................2 2.2.1編程環境..................................................................................................................3 2.2.2簡單易用..................................................................................................................3 2.2.3強處理能力..............................................................................................................3 2.2.4應用軟件開發..........................................................................................................3 2.3MATLAB應用方面............................................................................................................3 第3章MATLAB課程設計任務....................................................................................................5 3.1任務一 MATLAB環境語法、基本運算及繪圖..............................................................5 3.1.1目的..........................................................................................................................5 3.1.2原理..........................................................................................................................5 3.1.3內容..........................................................................................................................5 3.2任務二 MATLAB數值運算.............................................................................................9 3.2.1目的..........................................................................................................................9 3.2.2原理..........................................................................................................................9 3.2.3內容..........................................................................................................................9 3.3任務三 MATLAB的符號計算.......................................................................................15 3.3.1目的........................................................................................................................15 3.3.2內容........................................................................................................................15 3.4任務四 MATLAB基本編程方法...................................................................................18 3.4.1目的........................................................................................................................18 3.4.2內容........................................................................................................................18 第4章 總結...................................................................................................................................23 第1章 引言 MATLAB是美國MathWorks公司出品的商業數學軟件,用于算法開發、數據可視化、數據分析以及數值計算的高級技術計算語言和交互式環境,主要包括MATLAB和Simulink兩大部分。 MATLAB是matrix&laboratory兩個詞的組合,意為矩陣工廠(矩陣實驗室)。是由美國mathworks公司發布的主要面對科學計算、可視化以及交互式程序設計的高科技計算環境。它將數值分析、矩陣計算、科學數據可視化以及非線性動態系統的建模和仿真等諸多強大功能集成在一個易于使用的視窗環境中,為科學研究、工程設計以及必須進行有效數值計算的眾多科學領域提供了一種全面的解決方案,并在很大程度上擺脫了傳統非交互式程序設計語言(如C、Fortran)的編輯模式,代表了當今國際科學計算軟件的先進水平。 MATLAB和Mathematica、Maple并稱為三大數學軟件。它在數學類科技應用軟件中在數值計算方面首屈一指。MATLAB可以進行矩陣運算、繪制函數和數據、實現算法、創建用戶界面、連接其他編程語言的程序等,主要應用于工程計算、控制設計、信號處理與通訊、圖像處理、信號檢測、金融建模設計與分析等領域。 MATLAB的基本數據單位是矩陣,它的指令表達式與數學、工程中常用的形式十分相似,故用MATLAB來解算問題要比用C,FORTRAN等語言完成相同的事情簡捷得多,并且MATLAB也吸收了像Maple等軟件的優點,使MATLAB成為一個強大的數學軟件。在新的版本中也加入了對C,FORTRAN,C++,JAVA的支持。 第2章MATLAB功能介紹 2.1 MATLAB功能特性 2.1.1主要功能 1.數值分析 2.數值和符號計算 3.數字圖像處理 4.數字信號處理 5.工程與科學繪圖 6.控制系統與仿真 7.通訊系統設計與仿真 8.財務與金融工程 2.1.2 MATLAB產品系列重要功能 ·MATLAB?: MATLAB 語言的單元測試框架 ·Trading Toolbox?: 一款用于訪問價格并將訂單發送到交易系統的新產品 ·Financial Instruments Toolbox?: 赫爾-懷特、線性高斯和 LIBOR 市場模型的校準和 Monte Carlo 仿真 ·Image Processing Toolbox?: 使用有效輪廓進行圖像分割、對 10 個函數實現 C 代碼生成,對 11 個函數使用 GPU 加速 ·Image Acquisition Toolbox?: 提供了用于采集圖像、深度圖和框架數據的 Kinect? for Windows?傳感器支持 ·Statistics Toolbox?: 用于二進制分類的支持向量機(SVM)、用于缺失數據的 PCA 算法和 Anderson-Darling 擬合優度檢驗 MATLAB工作界面 ·Data Acquisition Toolbox?: 為 Digilent Analog Discovery Design Kit 提供了支持包 ·Vehicle Network Toolbox?: 為訪問 CAN 總線上的 ECU 提供 XCP 2.2MATLAB優勢特點 1.高效的數值計算及符號計算功能,能使用戶從繁雜的數學運算分析中解脫出來; 2.具有完備的圖形處理功能,實現計算結果和編程的可視化; 3.友好的用戶界面及接近數學表達式的自然化語言,使學者易于學習和掌握; 4.功能豐富的應用工具箱(如信號處理工具箱、通信工具箱等),為用戶提供了大量方便實用的處理工具。 2.2.1編程環境 MATLAB由一系列工具組成。這些工具方便用戶使用MATLAB的函數和文件,其中許多工具采用的是圖形用戶界面。包括MATLAB桌面和命令窗口、歷史命令窗口、編輯器和調試器、路徑搜索和用于用戶瀏覽幫助、工作空間、文件的瀏覽器。隨著MATLAB的商業化以及軟件本身的不斷升級,MATLAB的用戶界面也越來越精致,更加接近Windows的標準界面,人機交互性更強,操作更簡單。而且新版本的MATLAB提供了完整的聯機查詢、幫助系統,極大的方便了用戶的使用。簡單的編程環境提供了比較完備的調試系統,程序不必經過編譯就可以直接運行,而且能夠及時地報告出現的錯誤及進行出錯原因分析。 2.2.2簡單易用 MATLAB是一個高級的矩陣/陣列語言,它包含控制語句、函數、數據結構、輸入和輸出和面向對象編程特點。用戶可以在命令窗口中將輸入語句與執行命令同步,也可以先編寫好一個較大的復雜的應用程序(M文件)后再一起運行。新版本的MATLAB語言是基于最為流行的C++語言基礎上的,因此語法特征與C++語言極為相似,而且更加簡單,更加符合科技人員對數學表達式的書寫格式。使之更利于非計算機專業的科技人員使用。而且這種語言可移植性好、可拓展性極強,這也是MATLAB能夠深入到科學研究及工程計算各個領域的重要原因。 2.2.3強處理能力 MATLAB是一個包含大量計算算法的集合。其擁有600多個工程中要用到的數學運算函數,可以方便的實現用戶所需的各種計算功能。函數中所使用的算法都是科研和工程計算中的最新研究成果,而且經過了各種優化和容錯處理。在通常情況下,可以用它來代替底層編程語言,如C和C++。在計算要求相同的情況下,使用MATLAB的編程工作量會大大減少。MATLAB的這些函數集包括從最簡單最基本的函數到諸如矩陣,特征向量、快速傅立葉變換的復雜函數。函數所能解決的問題其大致包括矩陣運算和線性方程組的求解、微分方程及偏微分方程的組的求解、符號運算、傅立葉變換和數據的統計分析、工程中的優化問題、稀疏矩陣運算、復數的各種運算、三角函數和其他初等數學運算、多維數組操作以及建模動態仿真等。 2.2.4應用軟件開發 在開發環境中,使用戶更方便地控制多個文件和圖形窗口;在編程方面支持了函數嵌套,有條件中斷等;在圖形化方面,有了更強大的圖形標注和處理功能,包括對性對起連接注釋等;在輸入輸出方面,可以直接向Excel和HDF5進行連接。 2.3MATLAB應用方面 MATLAB 產品族可以用來進行以下各種工作: ●數值分析 ●數值和符號計算 ●工程與科學繪圖 ●控制系統的設計與仿真 ●數字圖像處理技術 ●數字信號處理技術 ●通訊系統設計與仿真 ●財務與金融工程 ●管理與調度優化計算(運籌學) MATLAB 的應用范圍非常廣,包括信號和圖像處理、通訊、控制系統設計、測試和測量、財務建模和分析以及計算生物學等眾多應用領域。附加的工具箱(單獨提供的專用MATLAB函數集)擴展了MATLAB 環境,以解決這些應用領域內特定類型的問題。 第3章MATLAB課程設計任務 3.1任務一 MATLAB環境語法、基本運算及繪圖 3.1.1目的 1、掌握 MATLAB軟件使用的基本方法; 2、熟悉 MATLAB 的數據表示、基本運算方法; 3、熟悉 MATLAB 繪圖命令及基本繪圖控制。 3.1.2原理 MATLAB環境是一種為數值計算、數據分析和圖形顯示服務的交互式的環境。MATLAB有3種窗口,即:命令窗口(The Command Window)、m-文件編輯窗口(The Edit Window)和圖形窗口(The Figure Window),而Simulink另外又有Simulink模型編輯窗口。 1.命令窗口(The Command Window) 當MATLAB啟動后,出現的最大的窗口就是命令窗口。用戶可以在提示符“>>”后面輸入交互的命令,這些命令就立即被執行。 在MATLAB中,一連串命令可以放置在一個文件中,不必把它們直接在命令窗口內輸入。在命令窗口中輸入該文件名,這一連串命令就被執行了。因為這樣的文件都是以“.m”為后綴,所以稱為m-文件。 2.m-文件編輯窗口(The Edit Window)我們可以用m-文件編輯窗口來產生新的m-文件,或者編輯已經存在的m-文件。在MATLAB主界面上選擇菜單“File/New/M-file”就打開了一個新的m-文件編輯窗口;選擇菜單“File/Open”就可以打開一個已經存在的m-文件,并且可以在這個窗口中編輯這個m-文件。 3.1.3內容 1、幫助命令,使用 help 命令,查找 exp(求冪)函數的使用方法,如圖3-1。 圖3-1 exp(求冪)函數的使用方法圖 2、矩陣運算 (1)矩陣的乘法,已知 A=[1 2 3;2 3 4;1 3 5];B=[1 2 3;4 5 6;2 1 6],求 A*B,A^2,A.*B,A^2*B。結果如下: (2)矩陣除法,已知 A=[1 2 3;3 5 6;4 8 6];B=[1 0 0;0 2 0;0 0 3];AB,A/B,A./B,A.B。結果如下: (3)矩陣的轉置及共軛轉置,已知 A=[5+i,2-i,1;6*i,4,9-i];求 A.', A'。結果如下: (4)使用冒號選出指定元素,已知: A=[1 2 3;4 5 6;7 8 9];求 A 中第 3 列前 2 個元素;A 中所有列第 2,3 行的元素。結果如下: 3、多項式 (1)求多項式 p(x)= x3 + 2x+ 4的根。結果如下: (2)已知 A=[1.2 3 5 0.9;5 1.7 5 6;3 9 0 1;1 2 3 4],求矩陣 A 的特征多項式;求特征多項式中未知數為 20 時的值; 把矩陣 A 作為未知數代入到多項式中。結果如下圖所示: 圖3-2 結果圖 圖3-3結果圖 4、基本繪圖命令 在同一坐標系中繪制余弦曲線 y=cos(t-0.2)和正弦曲線 y=sin(t-0.3),t∈[0,2π];余弦曲線 y=cos(t-0.2)的線形為點劃線、顏色為綠色、數據點標記為加號;正弦曲線 y=sin(t-0.3)的線形為虛線、顏色為紅色、數據點標記為星號;顯示坐標的范圍、刻度線、網絡線;標注坐標軸名稱、標題。 程序: 圖3-4程序圖 圖3-5結果圖 3.2任務二 MATLAB數值運算 3.2.1目的 1.熟悉Matlab中各類數據,尤其是矩陣的定義、賦值和運用; 2.了解Matlab的矩陣分析函數以及求線性方程組的數值解; 3.熟悉多項式運算函數、數值插值。 3.2.2原理 1.創建矩陣的方法 a.直接輸入法規則:矩陣元素必須用[ ]括住;矩陣元素必須用逗號或空格分隔;在[ ]內矩陣的行與行之間必須用分號分隔。逗號和分號的作用:逗號和分號可作為指令間的分隔符,matlab允許多條語句在同一行出現。分號如果出現在指令后,屏幕上將不顯示結果。 b.用matlab函數創建矩陣:空陣 [ ] — matlab允許輸入空陣,當一項操作無結果時,返回空陣;rand —— 隨機矩陣;eye —— 單位矩陣;zeros ——全部元素都為0的矩陣;ones ——全部元素都為1的矩陣 c.矩陣的修改:可用?鍵找到所要修改的矩陣,用?鍵移動到要修改的矩陣元素上即可修改;指令修改:可以用A(?,?)= ? 來修改。 2.矩陣運算 a.矩陣加、減(+,-)運算規則:(1)相加、減的兩矩陣必須有相同的行和列兩矩陣對應元素相加減。(2)允許參與運算的兩矩陣之一是標量。標量與矩陣的所有元素分別進行加減操作。 b.矩陣乘(??,./,.)運算規則:A矩陣的列數必須等于B矩陣的行數;標量可與任何矩陣相乘。 c.矩陣乘方—— a^n,a^p,p^a a ^ p —— a 自乘p次冪,對于p的其它值,計算將涉及特征值和特征向量,如果p是矩陣,a是標量,a^p使用特征值和特征向量自乘到p次冪;如a,p都是矩陣,a^p則無意義。 d.多項式運算 matlab語言把多項式表達成一個行向量,該向量中的元素是按多項式降冪排列的。 f(x)=anxn+an-1xn-1+……+a0 可用行向量 p=[an an-1 …… a1 a0]表示;poly —— 產生特征多項式系數向量 e.代數方程組求解 matlab中有兩種除運算左除和右除。 3.2.3內容 1.輸入下列向量(矩陣),>> g = [1 2 3 4];h = [4 3 2 1]。 2.分別執行以下數組點運算,>> s1 = g + h, s2 = g.*h, s3 = g.^h,s4 = g.^2, s5 = 2.^h。 3.輸入下列特殊矩陣,>>A=[ ],>>A=eye(10),A=rand(10,15),>> A=randn(5,10),>> A=zeros(5,10)。 圖3-6 結果圖 圖3-7 結果圖 圖3-8 結果圖 >>A=ones(5,10),>> 圖3-9 結果圖 圖3-10 結果圖 4.輸入下列矩陣及矩陣函數 >> A=[2 0 –1;1 3 2];B=[1 7 –1;4 2 3;2 0 1];>> M = A*B % 矩陣A與B按矩陣運算相乘 >> det_B = det(B) % 矩陣A的行列式 >> rank_A = rank(A) % 矩陣A的秩 >> inv_B = inv(B) % 矩陣B的逆矩陣 >> [V,D] = eig(B) % 矩陣B的特征值矩陣V與特征向量構成的矩陣D >> X = A/B % A/B = A*B-1,即XB=A,求X >> Y = BA’ % BA’ = B-1*A’,即BY=A’,求Y 5.多項式運算 >> p=[1 2 0-5 6] >> rr=roots(p)>> pp=poly(rr)>> s=[0 0 1 2 3] >> c=conv(p,s)>> d=polyder(p)>> x=-1:0.1:2;>> y=polyval(p,x) 43% 表示多項式p(x)?x?2x?5x?6 % 求多項式p的根 % 由根的列向量求多項式系數 2s(x)?x?2x?3 % 表示多項式 % 多項式乘積 % 多項式微分 % 計算多項式的值 圖3-11 結果圖 10(s?3)6.有理多項式: G(s)?(s?1)(s2?s?3) >> n=conv([10],[1 3]) % 定義分子多項式 >> d=conv([1 1],[1 1 3]) % 定義分母多項式 >> [r,p,k]=residue(n,d) % 進行部分分式展開 >> p1=[1-p(1)],p2=[1-p(2)] % 定義兩個極點多項式p1(s)=s-p(1),p2(s)=s-p(2)>> den=conv(p1,p2) % 求分母多項式den=p1(s)*p2(s) >> r1=r(1),r2=r(2)>> num=conv(r1,p2)+conv(r2,p1)% 求分子多項式 >> [num,den]=residue(r,p,k)% 根據r,p,k的值求有理多項式 7.函數插值運算 線形樣條插值 >>x=0:10 >> y=sin(x)>> x0=[ 3.4 4.7 6.5 8.2] >> y0=interp1(x,y,x0) % 線形插值 >> x1=0:0.1:10 >> y1=sin(x1)>> plot(x1,y1,'r:',x,y,'b*',x0,y0,'g.')% 插值比較 圖3-12 結果圖 3.3任務三 MATLAB的符號計算 3.3.1目的 1、掌握 MATLAB符號表達式的創建及代數運算; 2、掌握 MATLAB符號微積分; 3、掌握MATLAB 符號方程的求解。 3.3.2內容 ?a11a12? 1、求矩陣A?a21a22???a31a32 a13?a23??的行列式、逆陣和特征值。a33?? 15 圖3-13 結果圖 432 2.因式分解x?5x?5x?5x?6 432(x?1)?5x?5(x?2)?5x?1的同類項。3.合并 4(x?1)4.求的展開式。 5.求下列式子極限 : lim?x?2ln(sinx) (??2x) 6.求下列函數的導數 y?excosx?x3及當x=3時的導數值。 7.已知矩陣 ?exA???sinx x2?2x??lnx?,求A的導數 8.求下列積分: (1) ?sinx1?sinx2dx(2) ??0sinx3?sinx5dx 9.求微分方程 x2?2xy?y2?(y2?xy)dy?0dxy|x?1?1 3.4任務四 MATLAB基本編程方法 3.4.1目的 1、掌握 MATLAB 軟件使用的基本方法; 2、熟悉 MATLAB 程序設計的基本方法。 3.4.2內容 1、編寫程序完成如下功能:提示用戶輸入1或者2,當用戶輸入1時,對產生的隨機序列進行降序排序;當用戶輸入2時,對產生的隨機序列進行升序排列。 程序如下: clear; syms n ikey=0;while(ikey==0)s1=input('請輸入[1/2]?','s');x=randperm(10)if(s1=='2') ikey=1; y=sort(x,'ascend'); disp(['升序排列的向量為:',num2str(y)]);else if(s1=='1') ikey=1; y=sort(x,'descend'); disp(['降序排列的向量為:',num2str(y)]); end break end end 圖3-14 結果圖 2、編寫程序實現如下功能:如果想對一個變量 x 自動賦值,當從鍵盤輸入 y 或 Y 時(表示是),x 自動賦為 1;當從鍵盤輸入 n 或 N 時(表示否),x 自動賦為 0;輸入其他字符時終止程序。 程序如下: ikey=0;while(ikey==0)s1=input('若給X賦值請輸入[y/n]?','s');if(s1=='y'|s1=='Y'), ikey=1;x=1 else if(s1=='n'|s1=='N')ikey=1;x=0,end break end End 3-15 結果圖 3.編寫函數實現如下功能:輸入一個百分制的成績,要求輸出成績的等級,其中90-100分輸出為優秀,80-89分輸出為良好,70-79輸出為中等,60-69輸出為及格,60分以下不及格,如果輸入的數據不是百分制,顯示出錯信息并提示:請輸出百分制成績。 程序如下: clear;m=input('請輸入一個數值:');m=ceil(m/10);switch m case {10,9} disp('優秀');case 8 disp('良好');case 7 disp('中等');case 6 disp('及格');case {5,4,3,2,1,0} disp('不及格');otherwise disp('輸入有誤!')End 運行結果: 請輸入百分之原始成績:92 五級制成績為: 優秀 請輸入百分之原始成績:88 五級制成績為: 良好 請輸入百分之原始成績:64 五級制成績為: 及格 請輸入百分之原始成績:56 五級制成績為: 不及格 4.編寫函數計算s=n!syms n s=1 N=input('data n:');for i=1:N s=s*i;end s s = 1 data n:6 s = 720 5.編寫程序,計算1+3+5+…(2n+1)的值,使用input語句輸入n的值。程序如下: n=input('input: n=');s = sum(1:2:(2*n+1))input: n=7 運行結果: s = 64 第4章 小結 通過這次對MATLAB的親身操作和實踐,學習掌握了許多原本不知道的或者不太熟悉的命令。比如說相關m文件的建立,畫圖用到的標注,配色,坐標控制,同一張圖里畫幾幅不同的圖像,相關參數的設置以及相關函數的調用格式等等。 就拿建立一個數學方程而言,通過設置不同的參數達到所需要的要求和結果,而且還可以在不同的窗口建立不同的函數而達到相同的效果,比如說可以再命令窗口和m文件中通過不同的命令設置的到相同的所需的效果圖。而自己對于矩陣及閉環傳遞函數的建立原本所掌握的知識幾乎為零,而通過這次實驗使我徹底的掌握了相關的命令操作和處理的方法,在這里我們不僅可以通過建立函數和參數來達到目標效果,而且還可以通過可視化的編程達到更快更方便,更簡潔的效果。就拿可視化編程而言原本根本就只是聽說而已罷了,從來就沒有親身去嘗試過,然而現在自己卻可以和容易的通過搭建不同功能木塊來實現相關的函數及功能。這些在原本根本就不敢相信,然而通過MATLAB的學習和實驗親身操作這些原本看似不可能的操作在此就變的輕而易舉的事了。 要想取得更大的成績就得不斷的去努力學習和汲取相關的知識和技巧。萬不可自以為傲,裹足不前,MATLAB真的是個非常強大和有用的工具我們真正的能把它學懂學透的話還是需要下非常大的功夫和努力的。然而,不是說興趣才是最大的老師嘛,我也相信,只要你自己有興趣,即使它再怎么強大和難搞,我們能做的還是非常多的,關鍵的就只是在于你自己的態度了。我這里想說的事,MATLAB對于我來說是非常有吸引力的,我不敢說自己多么喜歡它,但是興趣確實蠻高的,所以我相信在以后的學習和工作當中MATLAB將成為我非常有用的幫忙工具和好伙伴,也許這要說有點太草率了,但是我覺得對它的評價怎么也不會讓每一個接觸過它的人吝嗇是自己贊美之詞。它不僅僅可以用來建模分析函數,還可以用來進行圖形的建模和仿真,還可以用來分析系統和函數的參數穩定性等等。 clear all; load('Hsoa2ib2.mat') Hsoa2ib2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsoa2ib1.mat') Hsoa2ib1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsoa1ib2.mat') Hsoa1ib2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsoa1ib1.mat') Hsoa1ib1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hscb2cb2.mat') Hscb2cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hscb2cb1.mat') Hscb2cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hscb1cb2.mat') Hscb1cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hscb1cb1.mat') Hscb1cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca2cb2.mat') Hsca2cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca2cb1.mat') Hsca2cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca2ca2.mat') Hsca2ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca2ca1.mat') Hsca2ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca1cb2.mat') Hsca1cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca1cb1.mat') Hsca1cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca1ca2.mat') Hsca1ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca1ca1.mat') Hsca1ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hoa2ca2.mat') Hoa2ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hoa2ca1.mat') Hoa2ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hoa1ca2.mat') Hoa1ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hoa1ca1.mat') Hoa1ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb2ib2.mat') Hcb2ib2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb2ib1.mat') Hcb2ib1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb2cb2.mat') Hcb2cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb2cb1.mat') Hcb2cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb1ib2.mat') Hcb1ib2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb1ib1.mat') Hcb1ib1=(a4+1i*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb1cb2.mat') Hcb1cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb1cb1.mat') Hcb1cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hca2ca2.mat') Hca2ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hca2ca1.mat') Hca2ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hca1ca2.mat') Hca1ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hca1ca1.mat') Hca1ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8; for k=2:401;w=2*pi*f [Hcaca]=[Hca1ca1(k),Hca1ca2(k);Hca2ca1(k),Hca2ca2(k)]/(-w(k)^2);[Hcbcb]=[Hcb1cb1(k),Hcb1cb2(k);Hcb2cb1(k),Hcb2cb2(k)]/(-w(k)^2);[Hcbib]=[Hcb1ib1(k),Hcb1ib2(k);Hcb2ib1(k),Hcb2ib2(k)]/(-w(k)^2);[Hoaca]=[Hoa1ca1(k),Hoa1ca2(k);Hoa2ca1(k),Hoa2ca2(k)]/(-w(k)^2); [Hscaca]=[Hsca1ca1(k),Hsca1ca2(k);Hsca2ca1(k),Hsca2ca2(k)]/(-w(k)^2); [Hscacb]=[Hsca1cb1(k),Hsca1cb2(k);Hsca2cb1(k),Hsca2cb2(k)]/(-w(k)^2); [Hscbcb]=[Hscb1cb1(k),Hscb1cb2(k);Hscb2cb1(k),Hscb2cb2(k)]/(-w(k)^2); [Hsoaib]=[Hsoa1ib1(k),Hsoa1ib2(k);Hsoa2ib1(k),Hsoa2ib2(k)]/(-w(k)^2);KsD=inv(Hscaca*transpose(inv(Hscacb))*Hscbcb-Hscacb);Ks11D(k)=KsD(1,1);Ks22D(k)=KsD(2,2); KsP=inv(Hcbib*inv(Hsoaib)*Hoaca-Hcaca-Hcbcb);Ks11P(k)=KsP(1,1);Ks22P(k)=KsP(2,2); Ks11(k)=197800+j*w(k)*1344.2;Ks22(k)=189300+j*w(k)*1625.4;end subplot(2,1,1); semilogy(f,abs(Ks11D),'--r',f,abs(Ks11P),'-y',f,abs(Ks11),':b');subplot(2,1,2); semilogy(f,abs(Ks22D),'--r',f,abs(Ks22P),'-y',f,abs(Ks22),':b');grid on,xlabel('頻率'),ylabel('動剛度'),title('半對數頻譜圖'),legend('直接法','間接法','測量法'); 實驗一 仿真條件:電機空載下,輸入為階躍信號,仿真時間為0.4S。 階躍信號,仿真時間為0.4S。 圖二 磁鏈圖 實驗結果:開始時有摩擦轉矩,在短時間內能夠快速形成圓形轉矩。 圖1 速度響應曲線 實際結果:時間與電機負載轉矩為0時的電機響應速度曲線,速度響應誤差為0。 仿真條件:電機空載下,輸入為 仿真條件:d軸電流設置為0,輸入為階躍信號,電機空載運行響應時間為0.4秒。 圖三 速度電流響應曲線 實際結果:在0.02秒時間達到目標轉速,iq達到穩定。 實驗三 實驗目的:驗證比列系數對穩態跟蹤誤差的影響。 仿真條件:修改KVFF為0,KAFF為0,負載為0,KPP為169,KPD為200.8,kpi為0 圖四 速度 EP的響應曲線 試驗目的:驗證比例系數對穩態跟蹤誤差的關系ESS=V/K穩態跟蹤誤差越來越小。 仿真條件:修改KVFF為0,KAFF為0,負載為0,KPP為500,KPD為200.8,kpi為0。 圖五 速度 EP的響應曲線 試驗目的:驗證比例系數對穩態跟蹤誤差的關系。 仿真條件:修改KVFF為0,KAFF為0,負載為0,KPP為5000,KPD為200.8,kpi為0。 圖六 速度 EP的響應曲線 實驗結果:Ep=V/K,隨著K的增加,V不變,EP漸漸減小,前饋=1,完全補償誤差,穩定位置跟蹤誤差=0.試驗目的:修改前饋系數觀察穩態跟蹤誤差關系。 仿真條件:使KVFF為0.5電機負載為0使電機的摩擦系數為0。 圖七 速度 EP的響應曲線 試驗結論:修改前饋系數觀察穩態跟蹤誤差關系。仿真條件:使KVFF為1電機負載為0使電機的摩擦系數為0。 圖八 速度 EP的響應曲線 實驗結果:由穩態跟蹤誤差=速度/比列系數(ess=v/k)得,比列系數越大,速度不變,穩態跟蹤誤差越大。 實驗二 條件:電流給定信號(iq=500HZF方波),Id=0。電機的摩擦系數為無窮大,看Iq的響應波形。 實驗結果:電機的摩擦系數為1000時,TL會反向轉動。 條件:電流環達到速度環輸出,還原參數速度還比列信號改成正弦波,繼續增加頻率。 正弦波頻率為100HZ 正弦波頻率為200HZ 正弦波頻率為500HZ 正弦波頻率為700HZ 實驗四 實驗條件:建立一個直流電機單速度閉環調節器。 1.求f(x)=4x6-x+x3-95在(0,100)上最大值、最小值,根。(使用函數fminbnd、roots) >>[x,y]=fminbnd('4*x.^6-x+x.^3-95',0,100)x = 0.4432 y = -95.3258 >> [x,y]=fminbnd('-4*x.^6+x-x.^3+95',0,100)x = 99.9999 y =-4.0000e+012 >> a=[4 0 0 1 0-1-95];roots(a)ans = 1.6860 0.8525 + 1.4852i 0.85251.4514i 求解常微分方程x’’=-x’+x+1,x’(0)=1,x(0)=0(使用函數dsolve)dsolve('D2x=-Dx+x+1','Dx(0)=1','x(0)=0')ans =(5^(1/2)*exp(t*(5^(1/2)/23))/(10*exp(t*(5^(1/2)/2 + 1/2)))1/3 + 1/51/11 +...)其中 n 為函式的輸入,級數和 f(n)則是函式的輸出。此外,你必須進行下列事項: function f=pifun(n)l=1;s=0;for i=1:n s=s+l/(2*i-1);l=-l;end s=4*s;disp('f(n)的值是');disp(num2str(s))(1)使用 tic 和 toc 指令來測量 pifun(100000)的計算時間。如果你不知道如何使用這兩個指令,請使用 help tic 及 help toc 來查出它們的用法。我的計算機是 Pentium-450,所得的計算時間約為 2 秒。請說明你的計算機規格以及其計算時間。 >> tic,pifun(100000),toc f(n)的值是 3.1416 Elapsed time is 0.028928 seconds.Cpu Pentium dual—core e5300(2)使用 flops 指令來測量 pifun(100000)所用到 floating point operations 的計算次數。如果你不知道如何使用這個指令,請使用 help flops 來查出它的用法。 14、寫一個 MATLAB 的遞歸函式 fibo.m 來計算 Fibonacci 數列,其定義如下: fibo(n+2)= fibo(n+1)+fibo(n)此數列的啟始條件如下: fibo(1)= 0, fibo(2)= 1.function f=fibo(n)if n==1 f=0;elseif n==2 f=1;else f=fibo(n-1)+fibo(n-2);end 求下列函數的極小點: 1)f?X??x2?4x2?9x2?2x?18x; 12312>> f='x(1)^2+4*x(2)^2+9*x(3)^2-2*x(1)+18*x(2)';[x,fm]=fminsearch(f,[0,0,0])x = 1.0000-2.2500 0.0000 fm = -21.2500 2) f?X??2x1; 32?x2?2x1x2?x1?2x22>> f='x(1)^2+3/2*x(2)^2-2*x(1)*x(2)+x(1)-2*x(2)';[x,fm]=fminsearch(f,[0,0]) x = 0.*** 1.*** fm = -0.*** 3)f?X???x?1?4?22.12>> f='(x(1)-1)^4+x(2)^2';>> [x,fm]=fminsearch(f,[0;1])x = 0.***-0.*** fm = 4.24***82e-017 第1),2)題的初始點可任意選取,第3)題的初始點取為X0??0,1?T.?5x1?x2?x3?1?x?3x?x?2?3416. 解線性方程組 ?1并求系數矩陣的行列式。 ??x1?x2?5x4?3??2x3?4x4??1 a=[5 1-1 0 1;1 0 3-1 2;-1-1 0 5 3;0 0 2 4-1];>> rref(a) ans = 1.0000 0 0 0 1.4000 0 1.0000 0 0 -5.9000 0 0 1.0000 0 0.1000 0 0 0 1.0000 -0.3000 所以 x1=1.4;x2=-5.9;x3=0.1;x4=-0.3 a=[5 1-1 0;1 0 3-1;-1-1 0 5;0 0 2 4];>> det(a) ans = 2?f17. 設 f(x,y)= 4 sin(x y),求 ?x?y 3x?2,y?3 syms f s y;syms f x y;f=4*sin(x.^3*y);z=diff(diff(f,x),y);x=2;y=3;subs(z) >> zs17 ans = 1.0636e+003 18.求方程 3x4+4x3-20x+5 = 0 的所有解。 c=[3 4 0-20 5];roots(c) >> zs18 ans = -1.5003 + 1.5470i-1.50031.0860i 1.9536 + 1.0860i 1.0727 r = 8.6397e+003 即在第108年停產可獲最大利潤,最大利潤為8639.7百萬元。一幢樓房的后面是一個很大的花園。在花園中緊靠著樓房建有一個溫室,溫室高10英尺,延伸進花園7尺。清潔工要打掃溫室上方的樓房的窗戶。他只有借助于梯子,一頭放在花園中,一頭靠在樓房的墻上,攀援上去進行工作。他只有一架20米長的梯子,你認為他能否成功?能滿足要求的梯子的最小長度是多少? 步驟: 1.先進行問題分析,明確問題; 2.建立模型,并運用Matlab函數求解; 3.對結果進行分析說明; 4.line)設計程序畫出圖形,對問題進行直觀的分析和了解(主要用畫線函數plot。若梯子能恰好放置,則梯子的長度f與傾角x關系如下: ab7?f(x)?? (其中a=m, b=3.048m,0 L=inline('3.048/sin(x)+2.333/cos(x)','x');x=fminbnd(L,0.01,pi/2-0.01)l=subs(L) ezplot('3.048/sin(x)+2.333/cos(x)',[0,pi/2]) 由以上可知梯子的最小長度為7.59m。所以他能成功。 22.某大學青年教師從31歲開始建立自己的養老基金,他把已有的積蓄10000元也一次性地存入,已知月利率為0.001(以復利計),每月存入700元,試問當他60歲退休時,他的退休基金有多少?又若,他退休后每月要從銀行提取1000元,試問多少年后他的基金將用完? function f=title22()s=10000;t=0;for i=1:360 s=s*(1+0.001)+700;end fprintf('60?êí?DYê±í?DY?ù?eóD%f?a.n',s);while s>0 s=(s-1000)*(1+0.001);t=t+1;end t=ceil(t/12); fprintf('í?DYoó????òa′óò?DDìáè?1000?a£?%d?êoó?ù?e??ó?íê.n',t);>> zs22 60歲退休時退休基金有317480.843330元.退休后每月要從銀行提取1000元,32年后基金將用完.23.:請設計一個程序,程序完成下列功能:(1)讓用戶輸入一個矩陣A;(2)在A中找出小于0的矩陣元素的位置;(3)在A中統計出等于0的元素的個數;(4)顯示A的行數和列數; (5)找出矩陣A各元素中的最大值(顯示值,不顯示元素位置)。 function f=title20()a=input('??ê?è????óA: ');[m,n]=size(a);t=0;p=0;for i=1:m for j=1:n if a(i,j)<0 p=p+1; fprintf('μú%d??D?óú0μ?????ê?(%d,%d)n',p,i,j); end if a(i,j)==0 t=t+1; end end end B=a(:);max=B(1);for i=2:m*n if B(i)>max max=B(i); end end if p==0 disp('A?D??óDD?óú0μ??a??.');end fprintf('A?Dμèóú0μ??a??μ???êy?a%dn',t);fprintf('Aμ?DDêyoíáDêy·?±e?a%d£?%dn',m,n);fprintf('A?÷?a???Dμ?×?′ó?μ?a%dn',max); 24:請設計一個程序,程序完成下列功能:(1)讓用戶依次輸入兩個字符串s1和s2;(2)比較兩個字符串的長度并顯示比較結果; (3)判斷s1與s2有沒有長度在3個字符以上的相同子串,顯示判斷結果。function f=title24() s1=input('??ê?è?×?·?′?s1: ');s2=input('??ê?è?×?·?′?s2: ');m=length(s1);n=length(s2);t=m;kk=0;if m>n t=n; disp('s1μ?3¤?è′óóús2μ?3¤?è.');elseif m disp('s1μ?3¤?èD?óús2μ?3¤?è.');else disp('s1μ?3¤?èμèóús2μ?3¤?è.');end for i=4:t for j=1:m-i+1 for k=1:n-i+1 if strcmp(s1(j:j+i-1),s2(k:k+i-1))==1 l=0; for r=1:kk if strcmp(s1(j:j+i-1),b{r})==1 l=1; break;end end if l==0 kk=kk+1; b{kk}=s1(j:j+i-1); end end end end end for i=1:kk fprintf('μú%d???àí?×?·?′?£o',i);disp(b{i}); end 25:編寫程序模擬楊氏雙縫干涉 兩相干光源到接收屏上P點距離r1=(D2+(y-a/2)2)1/2, r2=(D2+(y+a/2)2)1/2,相位差 Φ=2π(r2-r1)/λ,光強I=4I0cos2(Φ/2)編寫程序 clear lam=500e-9;a=2e-3;D=1;ym=5*lam*D/a;xs=ym;n=101;ys=linspace(-ym,ym,n);for i=1:n r1=sqrt((ys(i)-a/2).^2+D^2);r2=sqrt((ys(i)+a/2).^2+D^2);phi=2*pi*(r2-r1)./lam;B(i,:)=sum(4*cos(phi/2).^2);end N=255;Br=(B/4.0)*N;subplot(1,2,1);image(xs,ys,Br);colormap(gray(N));subplot(1,2,2);plot(B,ys); 26:編寫程序模擬光柵衍射 公式:I=I0(sinα/α)2(sin(λβ)/sinβ)2 α=(πa/λ)sinΦ β=(πd/λ)sinΦ clear lam=500e-9;N=2;a=2e-4;D=5;d=5*a;ym=2*lam*D/a;xs=ym;n=1001;ys=linspace(-ym,ym,n);for i=1:n sinphi=ys(i)/D;alpha=pi*a*sinphi/lam;beta=pi*d*sinphi/lam; B(i,:)=(sin(alpha)./alpha).^2.*(sin(N*beta)./sin(beta)).^2;B1=B/max(B);end NC=255;Br=(B/max(B))*NC;subplot(1,2,1)image(xs,ys,Br);colormap(gray(NC));subplot(1,2,2)plot(B1,ys); 27:繪制三元函數w?x2?y2?z2的可視化圖形 x=-5:0.05:5;y=-5:0.05:5;z=-5:0.05:5;[x,y,z]=meshgrid(x,y,z);v=x.^2+y.^2+z.^2;isosurface(x,y,z,v,10);axis equal 28:繪制 z?f(x,y)?(1?x)?12ln(x?y)的圖象 [x,y,z,v] = flow; q=1./sqrt(1-x).*log(x-y)-z; p = patch(isosurface(x, y, z, v, 0));isonormals(x,y,z,q,p) set(p, 'FaceColor', 'blue', 'EdgeColor', 'none');view(3) camlight;lighting 29: 試完成matlab 動畫 霓虹燈效果動畫:一顆花心: clear;clc;close all c=5;t=linspace(-c,c);[x,y]=meshgrid(t);z=17*x.^2-16*abs(x).*y+17*y.^2-225;pcolor(x,y,z);shading interp pause(2);spinmap(10) 30:試完成matlab gui程序 function varargout = ex0(varargin)gui_Singleton = 1; gui_State = struct('gui_Name', mfilename,...'gui_Singleton', gui_Singleton,...'gui_OpeningFcn', @ex0_OpeningFcn,...'gui_OutputFcn', @ex0_OutputFcn,...'gui_LayoutFcn', [] ,...'gui_Callback', []);if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1});end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else gui_mainfcn(gui_State, varargin{:});end function ex0_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; global i a i=0; a=floor(100*rand); guidata(hObject, handles); function varargout = ex0_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function x1_Callback(hObject, eventdata, handles) function x1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end function x2_Callback(hObject, eventdata, handles) function x2_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end function p1_Callback(hObject, eventdata, handles) global i a x1= eval(get(handles.x1,'String')); if x1>a x2='high'; set(handles.x2,'string',num2str(x2));第二篇:Matlab實踐報告
第三篇:MATLAB上機實踐報告
第四篇:Matlab實習報告
第五篇:matlab實習報告(最新)