基於matlab的圖像處理的代碼:matlab數字圖像處理教程

1. 實驗與觀察:函數的可視化

1.1 Matlab二維繪圖命令

1. 周期函數與線性-周期函數

觀察:

clf, x=linspace(0,8*pi,100);  
F=inline('sin(x+cos(x+sin(x)))');  
y1=sin(x+cos(x+sin(x)));   y2=0.2*x+sin(x+cos(x+sin(x)));  
plot(x,y1,'k:',x,y2,'k-')  legend('sin(x+cos(x+sin(x))','0.2x+sin(x+cos(x+sin(x)))',2)

2. plot指令:繪製直角坐標的二維曲線

3. 圖形的屬性設置和屏幕控制

h=plot([0:0.1:2*pi],sin([0:0.1:2*pi])); grid on  
set(h,'LineWidth',5,'color','red'); set(gca,'GridLineStyle','-','fontsize',16)

設置y坐標的刻度並加以說明,並改變字體的大小。

h=plot([0:0.1:2*pi],sin([0:0.1:2*pi]));grid on,  
set(gca,'ytick',[-1 -0.5 0 0.5 1]),  set(gca,'yticklabel','a|b|c|d|e'),  
set(gca,'fontsize',20)

4. 文字標註指令

plot(x,y1,'b',x,y2,'k-') ,  
set(gca,'fontsize',15,'fontname','times New Roman'),  %設置軸對象的字體為times New Roman,字體的大小為15  
title(' it{Peroid and linear peroid function}');     
%加標題,注意文字用單引號' '加上斜杠''後可輸入不同的設置,例如it{…}表示花括弧里的文字為斜體;如果有多項設置,則可用………連續輸入。  
xlabel('x from 0 to 8*pi it{t}'); ylabel('it{y}');   %說明坐標軸  
text(x(49),y1(50)-0.4,'fontsize{15}bulletleftarrowThe period function {itf(x)}');
%在坐標(x(49),y1(50)-0.4)處作文字說明, 各項設置用""隔開。  
%fontsize{15}bulletleftarrow的意義依次是:字體大小=15  畫圓點 左箭頭  
text(x(14),y2(50)+1,'fontsize{15}The linear period  function {itg(x)}rightarrowbullet')   %與上一語句類似,用右箭頭
Matlab圖像處理之函數的可視化與作圖

圖1 文字標註

觀察指令legend和num2str的用法:在同一張圖上畫出,這裡, 並進行適當的標註。

zxy2_2.m

clf, t=0:0.1:3*pi;alpha=0:0.1:3*pi;  
plot(t,sin(t),'r-');hold on;  plot(alpha,3*exp(-0.5*alpha),'k:');  
set(gca,'fontsize',15,'fontname','times New Roman'),      
xlabel('it{t(deg)}');ylabel('it{magnitude}');  
title(' it{sine wave and {it{Ae}}^{-alpha{itt}}wave}');  %注意alpha的意義  
text(6,sin(6),'fontsize{15}The Value it{sin(t)} at {itt}=6rightarrowbullet', 'HorizontalAlignment','right'),  
%上面的語句是一整行,如果要寫成兩行,必須使用續行號 … ,例如要在「 bullet',」  
%後換行,需寫「bullet', …」後才能換行。  
% 'HorizontalAlignment','right' 表示箭頭所指的曲線對象在 文字的右邊。  
text(2,3*exp(-0.5*2),['fontsize{15}bulletleftarrow The Value of it{3e}^{-0.5 it{t}}=',num2str(3*exp(-0.5*2)),' at it{t} =2 ']);  
%num2str的用法:['string1',num2str,'string2'],注意方括弧的使用。  
%legend('itsin(t)','{itAe}^{-alphat}')   % 請結合圖形觀察此命令的使用

5. 圖形窗口的創建和分割

觀察:

clf,b=2*pi;x=linspace(0,b,50);  
for k =1:9  
y=sin(k*x);  
subplot(3,3,k),plot(x,y),axis([0,2*pi,-1,1])  
end

1.2多元函數的可視化與空間解析幾何(三維圖形)

本節通過高等數學的幾個例子觀察Matlab的三維繪圖功能和技巧。

1. 繪製二元函數

◆ 觀察:繪製的圖象,作定義域的裁剪。

◆ (1) 觀察meshgrid指令的效果。

a=-0.98;b=0.98;c=-1;d=1;n=10;  
x=linspace(a,b,n); y=linspace(c,d,n);  
[X,Y]=meshgrid(x,y);  
plot(X,Y,'+')

◆ 三維繪圖指令mesh、meshc、surf。

◆ (2) 做函數的定義域裁剪,觀察上述三維繪圖指令的效果。

程序zxy2_4.m

clear,clf,  
a=-1;b=1;c=-15;d=15;n=20;eps1=0.01;  
x=linspace(a,b,n);y=linspace(c,d,n);  
[X,Y]=meshgrid(x,y);  
for i=1:n             %計算函數值z ,並作定義域裁剪  
for j=1:n  
if (1-X(i,j))<eps1|X(i,j)-Y(i,j)<eps1  %if語句這樣用  
z(i,j)=NaN;                         %作定義域裁剪,定義域以外的函數值為NaN  
else  
z(i,j)=1000*sqrt(1-X(i,j))^-1.*log(X(i,j)-Y(i,j));   
end  
end  
end                   
zz=-20*ones(1,n);plot3(x,x,zz),grid off,hold on   %畫定義域的邊界線  
mesh(X,Y,z)               %繪圖,讀者可用meshz, surf, meshc在此替換之
xlabel('x'),ylabel('y'),zlabel('z'), box on    %把三維圖形封閉在箱體里

運行了zxy2_4.m 以後,有關向量存儲在工作空間中,在此基礎上,觀察上述等值線繪製指令的運行效果。

[cs,h]=contour(X,Y,z,15);  clabel(cs,h,'labelspacing',244)

2. 三元函數可視化: slice指令

◆ 觀察:繪製三元函數 的可視化圖形。

clf,x=linspace(-2,2,40); y=x; z=x;  
[X,Y,Z]=meshgrid(x,y,z); w=X.^2+Y.^2+Z.^2;  
slice(X,Y,Z,w,[-1,0,1],[-1,0,1],[-1,0,1]),colorbar

3. 空間曲線及其運動方向的表現:plot3和quiver指令

clf,  t=0:0.1:1.5;  
Vx=2*t;Vy=2*t.^2;Vz=6*t.^3-t.^2;  
x=t.^2;y=(2/3)*t.^3;z=(6/4)*t.^4-(1/3)*t.^3;  %由速度得到曲線  
plot3(x,y,z,'r.-'),hold on                    %畫飛行軌跡  
%算數值梯度,也就是重新計算數值速度矢量,這只是為了編程的方便,不是必須的  
Vx=gradient(x);Vy=gradient(y);Vz=gradient(z);  
quiver3(x,y,z,Vx,Vy,Vz),grid on   %畫速度矢量圖  
xlabel('x'),ylabel('y'),zlabel('z')
Matlab圖像處理之函數的可視化與作圖

圖2 飛機的飛行軌跡與方向

2應用、思考和練習

2.1 線性周期函數

zxy2_3_f.m

function f=zxy2_3_f(x)  
f=sin(x+cos(x));

zxy2_3.m

clear,clf  
a=-8;b=12;n=300;xx=linspace(a,b,n);  
h=zxy2_3_f(xx);  
S(1)=0;  
for i=2:n  
S(i)=S(i-1)+quad('zxy2_3_f',xx(i-1),xx(i));  
end  
subplot(1,2,1),plot(xx,S,'k-'),axis([a,b,-1.5,9])  
subplot(1,2,2),plot(xx,[h;zeros(1,length(xx))],'k-'),axis([a,b,-1.5,1.5])

2.2 平面截割法和曲面交線的繪製

◆ 用平行截面法討論由曲面構成的馬鞍面形狀。

zxy2_6.m (平行截割法示例,本程序的繪製兩曲面交線方法可以套用)

clf, a=-20;eps0=1;  
[x,y]=meshgrid(-10:0.2:10);  %生成平面網格  
v=[-10 10 -10 10 -100 100];  %設定空間坐標系的範圍  
colormap(gray)               %將當前的顏色設置為灰色  
z1=(x.^2-2*y.^2)+eps;        %計算馬鞍面函數z1=z1(x,y)  
z2=a*ones(size(x));          %計算平面 z2=z2(x,y)  
r0=abs(z1-z2)<=eps0;  
%計算一個和z1同維的函數r0,當abs(z1-z2)<=eps時r0 =1;當abs(z1-z2)>eps0時,r0 =0。  
%可用mesh(x,y,r0)語句觀察它的圖形,體會它的作用,該方法可以套用。  
zz=r0.*z2;xx=r0.*x;yy=r0.*y;   %計算截割的雙曲線及其對應的坐標  
subplot(2,2,2),                %在第2圖形窗口繪製雙曲線  
h1=plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'+');            
set(h1,'markersize',2),hold on,axis(v),grid on  
subplot(2,2,1),                %在第一圖形窗口繪製馬鞍面和平面  
mesh(x,y,z1);grid,hold on;mesh(x,y,z2);             
h2=plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'.');   %畫出二者的交線  
set(h2,'markersize',6),hold on,axis(v),  
for i=1:5           %以下程序和上面是類似的,通過循環繪製一系列的平面去截割馬鞍面  
a=70-i*30;         %在這裡改變截割平面  
z2=a*ones(size(x)); r0=abs(z1-z2)<=1;  zz=r0.*z2;yy=r0.*y;xx=r0.*x;  
subplot(2,2,3),  
mesh(x,y,z1);grid,hold on;mesh(x,y,z2);hidden off  
h2=plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'.'); axis(v),grid  
subplot(2,2,4),  
h4=plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'o');  
set(h4,'markersize',2),hold on,axis(v),grid on  
end

2.3 微分方程的斜率場

◆ 繪製微分方程 的斜率場,並將解曲線畫在圖中,觀察斜率場和解曲線的關係。

zxy2_5.m (繪製一階微分方程的斜率場和解曲線)

clf,clear    %清除當前所有圖形窗口的圖像,清除當前工作空間的內存變數。  
a=0;b=4;c=0;d=4;n=15;  
[X,Y]=meshgrid(linspace(a,b,n),linspace(c,d,n));   %生成區域中的網格。  
z=X.*Y;                                            %計算斜率函數。   
Fx=cos(atan(X.*Y));Fy=sqrt(1-Fx.^2);  %計算切線斜率矢量。  
quiver(X,Y,Fx,Fy,0.5),hold on,axis([a,b,c,d])  
%在每一網格點畫出相應的斜率矢量,0.5是控制矢量大小的控制參數,可以調整。  
[x,y]=ode45('zxy2_5f',[0,4],0.4);    %求解微分方程。  
%zxy2_5f.m是方程相應函數f(x,y)的程序,單獨編製;[x0,xs]=[0,4]為求解區間;  
%y0=0.4為初始值;輸出變數x,y分別為解軌線自變數和因變數數組。  
plot(x,y,'r.-')   %畫解軌線

zxy2_5f.m (微分方程的函數子程序)

function dy=zxy2_5f(x,y)  
dy=x.*y;

2.4 顏色控制和渲染及特殊繪圖指令

1. 地球表面的氣溫分布(sphere指令)

[a,b,c]=sphere(40);t=max(max(abs(c)))-abs(c);surf(a,b,c,t);  
axis('equal'),colormap('hot'), shading flat,colorbar

2. 旋轉曲面的生成:柱面指令cylinder和光照控制指令surfl

x=0:0.1:10;z=x;y=1./(x.^3-2.*x+4);  
[u,v,w]=cylinder(y);surfl(u,v,w,[45,45]);  
shading interp

3. 若干特殊圖形

◆ 運行下面程序,了解各指令的用法和效果。

x=[1:10]; y=[5 6 3 4 8 1 10 3 5 6];  
subplot(2,3,1),bar(x,y),axis([1 10 1 11])  
subplot(2,3,2),hist(y,x),axis([1 10 1 4])  
subplot(2,3,3),stem(x,y,'k'),axis([1 10 1 11])  
subplot(2,3,4),stairs(x,y,'k'),axis([1 10 1 11])  
subplot(2,3,5), x = [1 3 0.5 5];explode = [0 0 0 1];pie(x,explode)  
subplot(2,3,6),z=0:0.1:100; x=sin(z);y=cos(z).*10;  
comet3(x,y,z)

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/222340.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:09
下一篇 2024-12-09 14:09

相關推薦

發表回復

登錄後才能評論