版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2MATLAB語(yǔ)言基礎(chǔ)
2.1數(shù)據(jù)結(jié)構(gòu)
MATLAB語(yǔ)言的賦值語(yǔ)句有兩種:
變量名=運(yùn)算表達(dá)式
[返回變量列表]=函數(shù)名(輸入變量列表)
MATLAB支持變量和常量,更重要的,MATLAB支持IEEE標(biāo)準(zhǔn)的運(yùn)算符
號(hào),如pi為圓周率,i,j為虛數(shù)單位,Inf表示無(wú)窮大,NaN表示O/O、O*Inf或Inf/Inf
等運(yùn)算結(jié)果,稱(chēng)為“非數(shù)”。MATLAB變量名應(yīng)該由字母引導(dǎo),后面可以跟數(shù)字、
字母或下劃線等符號(hào)。MATLAB對(duì)變量名字母是區(qū)分大小寫(xiě)的。
2.1.1矩陣
MATLAB最基本的數(shù)據(jù)結(jié)構(gòu)是復(fù)數(shù)矩陣。矩陣用方括號(hào)口輸入,里面的各行
元素由分號(hào)分隔,而同一行的不同元素由逗號(hào)或空格分隔。如果賦值表達(dá)式末尾
有分號(hào),則其結(jié)果將不顯示,否則將顯示出全部結(jié)果。
B=[l+9i,2+8i,3+7j;4+6j5+5i,6+4i;7+3i,8+2jli]
B=
1.0000+9.0000i2.0000+8.0000i3.0000+7.0000i
4.0000+6.0000i5.0000+5.0000i6.0000+4.0000i
7.0000+3.0000i8.0000+2.0000i0+l.OOOOi
其中,元素l+9i表示復(fù)數(shù)項(xiàng)。
MATLAB和其他語(yǔ)言不同,它無(wú)需事先聲明矩陣的維數(shù)。下面的語(yǔ)句可以
建立一個(gè)更大的矩陣
B(2,5)=l
B=
1.0000+9.0000i2.0000+8.0000i3.0000+7.0000i00
4.0000+6.0000i5.0000+5.0000i6.0000+4.0000i01.0000
7.0000+3.0000i8.0000+2.0000i0+l.OOOOi00
(注意:B(2,5)代表第二行五列為1;與原來(lái)的對(duì)應(yīng),前面的兒個(gè)數(shù)不變,
新增加的后面幾行其余的全部為零。)
對(duì)矩陣可以使用size。來(lái)測(cè)其大小,也可以使用reshape。函數(shù)重新按列排列。
對(duì)向量來(lái)說(shuō),還可以用length。來(lái)測(cè)其長(zhǎng)度。不論原數(shù)組A是多少維的,A(:)將
返回列向量。
size(B)
length(B)%length函數(shù)代表“行”或“列”數(shù)中最大的一個(gè)。
reshape(B,5,3)%用此函數(shù)時(shí)元素個(gè)數(shù)不可改變,而且“重新排布”是按“列”
進(jìn)行的。
B(:)
ans=
35
ans=
5
ans=
1.0000+9.0000i8.0000+2.0000i0
4.0000+6.0000i3.0000+7.0000i0
7.0000+3.0000i6.0000+4.0000i0
2.0000+8.0000i0+l.OOOOi1.0000
5.0000+5.0000i00
ans=
1.0000+9.0000i
4.0000+6.0000i
7.0000+3.0000i
2.0000+8.0000i
5.0000+5.0000i
8.0000+2.0000i
3.0000+7.0000i
6.0000+4.0000i
0+l.OOOOi
0
0
0
0
1.0000
0
2.1.2冒號(hào)表達(dá)式
冒號(hào)表達(dá)式:sl:s2:s3
冒號(hào)表達(dá)式是MATLAB里最具特色的表示方法。這一語(yǔ)句可以生成一個(gè)行
向量,其中si為向量的起始值,s2為步長(zhǎng),而s3為向量的終止值。例如
S=0:.l:2*pi
將產(chǎn)生一個(gè)起始于0,步距為0.1,而終止于6.2的向量,而不是終止于2*pi。如
果寫(xiě)成S=0:-0.l:2*pi;則不出現(xiàn)錯(cuò)誤,而返回一-個(gè)空向量。
?s=(l:10)
12345678910
?s(l:-l:10)
ans=
Emptymatrix:l-by-0
另外,注意下列函數(shù)表達(dá)式及輸出以作對(duì)比
?s(10:-l:l)
ans=
10987654321
?s(10:l:l)
ans=
Emptymatrix:1-by-0
冒號(hào)表達(dá)式可以用來(lái)提取矩陣元素,例如B(:,l)將提取B矩陣的第1列而
B(l:2,1:2:5)將提取B的前2行與1,3,5列組成的子矩陣。在矩陣提取時(shí)還可以采
用end這樣的算符。如B(2:end,:)將提取B矩陣的后2行構(gòu)成的子矩陣。
2.1.3其它數(shù)據(jù)結(jié)構(gòu)
MATLAB的字符串是由單引號(hào)括起來(lái)的。如可以使用下面的命令賦值
strA=Thisisastring.1
MATLAB的單元數(shù)組可將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)納入一個(gè)變量之下,單元數(shù)組由
大括號(hào)表示下標(biāo)。
B={l;AlanShearer',180,[100,80,75;77,60,92;67,28,90;100,89,78]}
B=
[1]'AlanShearer'[180][4x3double]
訪問(wèn)單元數(shù)組應(yīng)該用大括號(hào)進(jìn)行,如第4單元中的元素可以由下面的語(yǔ)句得
出
B{4}
ans=
1008075
776092
672890
1008978
MATLAB的結(jié)構(gòu)體有點(diǎn)象C語(yǔ)言的結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)。每個(gè)成員變量用點(diǎn)號(hào)
表示,如A.p表示A變量的p成員變量。用下面的語(yǔ)句可以建立一個(gè)小型的數(shù)
據(jù)庫(kù)。
student_rec.number=l;
student_=,AlanShearer1;
student_rec.height=180;
student_rec.test=[100,80,75;77,60,92;67,28,90;100,89,78];
student_rec
student_rec=
number:1
name:'AlanShearer1
height:180
test:[4x3double]
2.2變量運(yùn)算
2.2.1MATLAB變量的代數(shù)運(yùn)算
如果給定兩個(gè)矩陣A和B,則我們可以用A+B,A-B,A*B可以立即得出其加、
減和乘運(yùn)算的結(jié)果。若這兩個(gè)矩陣數(shù)學(xué)上不可以這樣運(yùn)算,則將得出錯(cuò)誤信息,
并終止正在運(yùn)行的程序。
在MATLAB下,如果A和B中有一個(gè)是標(biāo)量,則可以無(wú)條件地進(jìn)行這樣的
運(yùn)算。MATLAB不介意這些變量是純實(shí)數(shù)還是含有虛部的復(fù)數(shù)。
矩陣的除法實(shí)際上就是線性方程的求解,如Ax=B這一線性方程組的解即
為x=inv(A)*B,inv(A)是A的逆矩陣。MATLAB中特有的左除\或右除/算法能更
有效地解這類(lèi)線性方程組(包括矛盾方程和不定方程),對(duì)矛盾方程會(huì)自動(dòng)采用最
小二乘法求解。Ax=B的解用左除和右除分別表示為x=A\B或x'=(A\B)'=B7A',
號(hào)是矩陣轉(zhuǎn)置符號(hào)。
K例2-21求解下面的四元一次方程組。
xl+x2+x3+x4=100
58.06x1+0.79x2+2.06x3+0.24x4=300
4.09x1+58.20x2+2.85x3+0.73x4=1171
20.77x1+29.99x2+43.26x3+4.91x4=1617
A=[1111
58.060.792.060.24
4.0958.202.850.73
20.7729.9943.264.91];
B=[100;300;1171;1617];
X=A\B
X=
4.1052
18.2863
15.7046
61.9039
方陣的乘方可以由“A”算符直接得出,如A^n。用MATLAB這樣的語(yǔ)言,你
可以輕易地算出AA0.1,亦即A矩陣開(kāi)10次方得出的主根。
矩陣的點(diǎn)運(yùn)算也是相當(dāng)重要的。所謂點(diǎn)運(yùn)算即兩個(gè)矩陣相應(yīng)元素的運(yùn)算,
如矩陣的點(diǎn)乘A.*B得出的是A和B對(duì)應(yīng)元素的積,故一搬情況下A*B不等于
A.*B。點(diǎn)運(yùn)算的概念又可以容易地用到點(diǎn)乘方上,例如A12,A.AA等都是可以接
受的運(yùn)算式子。
2.2.2邏輯運(yùn)算
MATLAB并沒(méi)有單獨(dú)定義邏輯變量。在MATLAB中,數(shù)值只有0和“非0”
的區(qū)分。非0往往被認(rèn)為是邏輯真,或邏輯1。除了單獨(dú)兩個(gè)數(shù)值的邏輯運(yùn)算外,
還支持矩陣的邏輯運(yùn)算,如A&B,AIB>hA分別表示邏輯與、或、非的運(yùn)算。
請(qǐng)看下面的矩陣A和B與運(yùn)算結(jié)果:
A=[0234;l350];B=[l053;1505];A&B
ans=
0011
1100
2.2.3關(guān)系表達(dá)式與表達(dá)式函數(shù)
MATLAB的大于、小于和等于等關(guān)系分別由〉、<和==表示。判定方法不完
全等同于C語(yǔ)言這類(lèi)只能處理單個(gè)標(biāo)量的語(yǔ)言。MATLAB關(guān)系表達(dá)式返回的是
整個(gè)矩陣。例如,比較兩個(gè)矩陣A和B是否相等,則可以給出如下命令,并得
出相應(yīng)的結(jié)果
A=[0234;l35O];B=[1053;1505];A==B
ans=
0000
1000
確實(shí)使得A和B對(duì)應(yīng)元素相等的位將返回1,否則返回0oMATLAB還可以用>=
和<=這樣的符號(hào)來(lái)比較矩陣對(duì)應(yīng)元素的大小。
另外,MATLAB還提供了all()和any()兩個(gè)函數(shù)來(lái)對(duì)矩陣參數(shù)作邏輯判定。
all()函數(shù)在其中變?cè)糠?時(shí)返回1,而any()函數(shù)在變?cè)蟹橇阍胤祷?。
find()函數(shù)將返回邏輯關(guān)系全部滿(mǎn)足時(shí)的矩陣下標(biāo)值,這個(gè)函數(shù)在編程中是相當(dāng)
常用。
2.2.4其他運(yùn)算
MATLAB還支持其他運(yùn)算,如round。四舍五入取整、fix。向原點(diǎn)方向取整、
FLOOR。向數(shù)軸左邊取整、CEILO向數(shù)軸右邊取整、rem(X,Y)求X/Y的余數(shù)、
sign。返回符號(hào)等。
2.3流程控制
作為一種常用的編程語(yǔ)言,MATLAB支持各種流程控制結(jié)構(gòu),如循環(huán)結(jié)構(gòu)、
條件轉(zhuǎn)移結(jié)構(gòu)、開(kāi)關(guān)結(jié)構(gòu)等另外MATLAB還支持一種新的結(jié)構(gòu)…試探結(jié)構(gòu)。
2.3.1循環(huán)結(jié)構(gòu)
循環(huán)語(yǔ)句有兩種結(jié)構(gòu):for...end結(jié)構(gòu)和while…end結(jié)構(gòu)。這兩種語(yǔ)句結(jié)構(gòu)
不完全相同,各有各的特色。for...end語(yǔ)句通常的調(diào)用格式為:
for循環(huán)變量=5193:52
循環(huán)體語(yǔ)句組
end
注意,這里的循環(huán)語(yǔ)句是以end結(jié)尾的,這和C語(yǔ)言的結(jié)構(gòu)不完全一致。
K例2-32求1+2+...+100的值。
mysum=0;fori=1:1:100,mysum=mysum+i;end;mysum
mysum=
5050
在上面的式子中,可以看到for循環(huán)語(yǔ)句中S3的值為lo在MATLAB實(shí)際
編程中,如果S3的值為1,則可以在該語(yǔ)句中省略,故該語(yǔ)句可以簡(jiǎn)化成for
i=l:100o
在實(shí)際編程中,在MATLAB下采用循環(huán)語(yǔ)句會(huì)降低其執(zhí)行速度,所以前面
的程序可以由內(nèi)部求和函數(shù)sum()下面可提高執(zhí)行速度:
i=l:l00;mysum=sum(i)或mysum=sum(l:100)
如果前面的100改成100000,再運(yùn)行這一程序,則可以明顯地看出,后一種
方法編寫(xiě)的程序比前一種方法快得多。測(cè)試執(zhí)行某程序段所花費(fèi)的時(shí)間可用命
令tic和toe實(shí)現(xiàn),前者位于欲測(cè)試的程序段入口,后者位于出口。請(qǐng)看下面的
對(duì)比:
tic;mysum=0;fori=1:1:100000,mysum=mysum+i;end;mysum,toe
mysum=
5.000le+009
elapsed_time=
0.4110
tic;mysum=sum(1:100000),toe
mysum=
5.000le+009
elapsed_time=
0.0200
MATLAB并不要求循環(huán)點(diǎn)等間距,假設(shè)V為任意一個(gè)向量,則可以用fori=V
來(lái)表示循環(huán):
V=[2.1-310/3piA2sin(pi/4)];mysum=0;fori=V,mysum=mysum+i;end;mysum
mysum=
13.0100
同樣的問(wèn)題在while循環(huán)結(jié)構(gòu)下可以表示為
tic;mysum=0;i=1;while(i<=100000),mysum=mysum+i;i=i+1;end;mysum,toc;
mysum=
5.000le+009
elapsed_time=
0.9110
由于while循環(huán)每次都要判斷后面的條件式,并且循環(huán)內(nèi)還多了i=i+l語(yǔ)句,
所以比f(wàn)or循環(huán)更慢!
2.3.2條件轉(zhuǎn)移結(jié)構(gòu)
條件轉(zhuǎn)移語(yǔ)句和C語(yǔ)言相象
if條件式1
條件塊語(yǔ)句組1
elseif條件式2
條件塊語(yǔ)句組2
else(notes:此處else后不加IF表示如果前面沒(méi)有滿(mǎn)足則用
下面條件直接計(jì)算)
條件塊語(yǔ)句組n+1
end
下面是利用條件轉(zhuǎn)移語(yǔ)句把百分制轉(zhuǎn)變?yōu)槲寮?jí)分制的例子:
mark=input。成績(jī)=');
ifmark>=90
disp(優(yōu));
elseifmark>=80
disp。良);
elseifmark>=70
disp('中');
elseifmark>=60
dispC及格);
else
dispC不及格);
end
2.3.3開(kāi)關(guān)結(jié)構(gòu)
開(kāi)關(guān)語(yǔ)句的基本結(jié)構(gòu)為:
switch開(kāi)關(guān)表達(dá)式
case表達(dá)式1
語(yǔ)句段1
case{表達(dá)式2,表達(dá)式3,...,表達(dá)式m}notes:只要滿(mǎn)足括號(hào)中任意條件,均可執(zhí)行下面的步驟
語(yǔ)句段2
otherwise
語(yǔ)句段n
end
MATLAB開(kāi)關(guān)語(yǔ)句與C有區(qū)別:
無(wú)需像C語(yǔ)言那樣在下一個(gè)case語(yǔ)句前加break語(yǔ)句;
把一些表達(dá)式用大括號(hào)括起來(lái),中間用逗號(hào)分隔,當(dāng)需滿(mǎn)足表達(dá)式之一時(shí)執(zhí)行某
一程序段;
各個(gè)表達(dá)式均不滿(mǎn)足時(shí),則將執(zhí)行otherwise語(yǔ)句后面的語(yǔ)句段,此語(yǔ)句等價(jià)于
C語(yǔ)言中的default語(yǔ)句;
在case語(yǔ)句引導(dǎo)的各個(gè)表達(dá)式中,不要用重復(fù)的表達(dá)式,否則列在后面的開(kāi)關(guān)
通路將永遠(yuǎn)也不能執(zhí)行;
程序的執(zhí)行結(jié)果和各個(gè)case語(yǔ)句的次序是無(wú)關(guān)的。
2.3.4試探結(jié)構(gòu)
MATLAB從5.2版本開(kāi)始提供了一種新的試探式語(yǔ)句結(jié)構(gòu),其一般的形式
為:
try
語(yǔ)句段1
catch
語(yǔ)句段2
end
本語(yǔ)句結(jié)構(gòu)首先試探性地執(zhí)行語(yǔ)句段1,如果在此段語(yǔ)句執(zhí)行過(guò)程中出現(xiàn)錯(cuò)
誤,則將錯(cuò)誤信息賦給保留的lasterr變量,并放棄這段語(yǔ)句,轉(zhuǎn)而執(zhí)行語(yǔ)句段2
中的語(yǔ)句,這種新的語(yǔ)句結(jié)構(gòu)是C等語(yǔ)言中所沒(méi)有的。
try
a=sin(cos(pi/4);
catch
lasterr
end
???a=sin(cos(pi/4);
(此外輸入至程序當(dāng)中會(huì)顯示錯(cuò)誤的地方)
Error:expected,found.
2.4函數(shù)編寫(xiě)
MATLAB程序大致分為兩類(lèi):M腳本文件(M-Script)和M函數(shù)(M-function),
它們均是普通的ASCII碼構(gòu)成的文件。M腳本文件中包含一族由MATLAB語(yǔ)
言所支持的語(yǔ)句,它類(lèi)似于DOS下的批處理文件,它的執(zhí)行方式很簡(jiǎn)單,用戶(hù)
只需在MATLAB的提示符》下鍵入該M文件的文件名,這樣MATLAB就會(huì)自
動(dòng)執(zhí)行該M文件中的各條語(yǔ)句,并將結(jié)果直接返回到MATLAB的工作空間。M
函數(shù)格式是MATLAB程序設(shè)計(jì)的主流,一般情況下,不建議您使用M腳本文件
格式編程。MATLAB提供了非常豐富的函數(shù),利用菜單中的help命令可以了解
各種函數(shù)的功能和使用方法。
MATLAB的M函數(shù)是由function語(yǔ)句引導(dǎo)的,其基本格式如下:
function[返回變量列表]=函數(shù)名(輸入變量列表)
注釋說(shuō)明語(yǔ)句段,由%引導(dǎo)-
輸入、返回變量格式的檢測(cè)
函數(shù)體語(yǔ)句
一(首詞必須是function,注釋那段作用為闡釋愈義)
這里輸入和返變量的實(shí)際個(gè)數(shù)分別由nargin和nargout兩個(gè)MATLAB保
留變量來(lái)給出,只要進(jìn)入該函數(shù),MATLAB就將自動(dòng)生成這兩個(gè)變量,不論您
是否直接使用這兩個(gè)變量。返回變量如果多于1個(gè),則應(yīng)該用方括號(hào)將它們括起
來(lái),否則可以省去方括號(hào)。輸入變量和返回變量之間用逗號(hào)來(lái)分割。
注釋語(yǔ)句段的每行語(yǔ)句都應(yīng)該由百分號(hào)引導(dǎo),百分號(hào)后面的內(nèi)容不執(zhí)行,
只起注釋作用。
一變量個(gè)數(shù)檢測(cè)也是必要的,如果輸入或返回變量格式不正確,則應(yīng)該給出
相應(yīng)的提示,不同的變量個(gè)數(shù)可能需要執(zhí)行不同的程序段。
K例2.4』假設(shè)我們想生成一個(gè)nxm階的Hilbert矩陣,它的第i行第j列的元素值
為l/(i+j-l)。我們想在編寫(xiě)的函數(shù)中實(shí)現(xiàn)下面兒點(diǎn):
1.如果只給出一個(gè)輸入?yún)?shù),則會(huì)自動(dòng)生成一個(gè)方陣,即令m=n
2.在函數(shù)中給出合適的幫助信息,包括基本功能、調(diào)用方式和參數(shù)說(shuō)明
3.檢測(cè)輸入和返回變量的個(gè)數(shù),如果有錯(cuò)誤則給出錯(cuò)誤信息
如果調(diào)用時(shí)不要求返回變量,則將顯示結(jié)果矩陣。其實(shí)在編寫(xiě)程序時(shí)養(yǎng)成一
個(gè)好的習(xí)慣,無(wú)論對(duì)程序設(shè)計(jì)者還是對(duì)程序的維護(hù)者、使用者都是大有裨益的。
采用MATLAB函數(shù)編寫(xiě)格式和上述要求,我們可以編寫(xiě)出一個(gè)函數(shù)
functionA=myhilb(n,m)
%MYHILBademonstrativeM-function.
%A=MYHILB(N,M)generatesanNbyMHilbertmatrixA.
%A=MYHILB(N)generatesanNbyNsquareHilbertmatrix.
%MYHILB(N,M)displaysONLYtheHilbertmatrix,butdonotreturnany
%matrixbacktothecallingfunction.
%
%Seealso:HILB.
%DesignedbyProfessorDingyuXUE,NortheasternUniversity,PRC
%5April,1995,LastmodifiedbyDYXat21March,2000
ifnargout>1,error(Toomanyoutputarguments.1);end
ifnargin==l,m=n;
elseifnargin==0Inargin>2
error(Wrongnumberofiutputarguments.*);
end
Al=zeros(n,m);
fori=l:n
forj=l:m
Al(ij)=l/(i+j-l);
end,end
ifnargout==1,A=A1;elseifnargout==0,disp(Al);end
這樣規(guī)范編寫(xiě)的函數(shù)用help命令可以顯示出其幫助信息:
?helpmyhilb
MYHILBademonstrativeM-function.
A=MYHILB(N,M)generatesanNbyMHilbertmatrixA.
A=MYHILB(N)generatesanNbyNsquareHilbertmatrix.
MYHILB(N,M)displaysONLYtheHilbertmatrix,butdonotreturnany
matrixbacktothecallingfunction.
Seealso:HILB.
有了函數(shù)之后,可以采用下面的各種方法來(lái)調(diào)用它,并產(chǎn)生出所需的結(jié)果。
A=myhilb(3,4)
A=
1.00000.50000.33330.2500
0.50000.33330.25000.2000
0.33330.25000.20000.1667
A=myhilb(4)
A=
1.00000.50000.33330.2500
0.50000.33330.25000.2000
0.33330.25000.20000.1667
0.25000.20000.16670.1429
3科學(xué)計(jì)算的可視化
科學(xué)計(jì)算的可視化通過(guò)圖形、圖象等來(lái)表現(xiàn),繪圖是可視化核心內(nèi)容。在傳
統(tǒng)的編程語(yǔ)言中,繪圖是編程中最繁雜的工作,而且費(fèi)時(shí)費(fèi)力。MATLAB提供
了非常方便實(shí)用的繪圖功能,下面將介紹常用的繪圖功能。
3.1二維繪圖
科學(xué)計(jì)算的可視化通過(guò)圖形、圖象等來(lái)表現(xiàn),繪圖是可視化核心內(nèi)容。在傳
統(tǒng)的編程語(yǔ)言中,繪圖是編程中最繁雜的工作,而且費(fèi)時(shí)費(fèi)力。MATLAB提供
了非常方便實(shí)用的繪圖功能,下面將介紹常用的繪圖功能。
假設(shè)有兩個(gè)同長(zhǎng)度的向量x和y,則用plot(x,y)就可以繪出二維曲線圖。plot。
函數(shù)還可以同時(shí)繪制出多條曲線,如圖3-l(a)(b)所示。
K例3-13繪制正弦余弦曲線:
t=0:.l:2*pi;
y=sin(t);
plot(t,y)
yl=cos(t);
figure
plot(t,y,t,yl);
如果未打開(kāi)過(guò)圖形窗口,將打開(kāi)一個(gè)新的圖形窗口繪圖,若有打開(kāi)過(guò)圖形窗
口,則在最后使用的圖形窗口上擦去原有圖形并繪制新的圖形。若想在另一個(gè)
新圖形窗口中繪圖,則在繪圖前加一個(gè)figure語(yǔ)句,若想在一個(gè)指定的編號(hào)為n
的圖形窗口中繪圖,則在繪圖前加一個(gè)figure(n)語(yǔ)句。
若兩條曲線的橫坐標(biāo)向量相同,可以把兩條曲線的縱坐標(biāo)向量合并成一個(gè)矩
陣,每條曲線的縱坐標(biāo)為矩陣的一行,繪圖語(yǔ)句如下表示。
plot(t,[y;yl])
Figure2目回區(qū)
EileEditYiewInsertloolsDesktopWindowHelp
口自q昌ia|<CT)@|夏|口困|■回
(b)
圖3-1二維曲線
axis。函數(shù)可以手動(dòng)地設(shè)置x,y坐標(biāo)軸范圍。
axis([02*pi-1.51.5])
由MATLAB繪制的二維圖形可以由下面的一些命令簡(jiǎn)單地修飾。如
grid%加網(wǎng)格線
xlabelC字符串)%給橫坐標(biāo)軸加說(shuō)明
ylabelC字符串)%給縱坐標(biāo)軸加說(shuō)明,并自動(dòng)旋轉(zhuǎn)90度
title。字符串)%給整個(gè)圖形加圖題
plot。函數(shù)最完整的調(diào)用格式為:
pk>t(xl,yl,選項(xiàng)1,x2,y2,選項(xiàng)2,x3,y3,選項(xiàng)3,...)
其中所有的選項(xiàng)如表3-1所示。一些選項(xiàng)可連用,如才表示紅色實(shí)線。
表3-1MATLAB繪圖命令的各種選項(xiàng)
4.1:MATLAB繪圖命令的各種選項(xiàng)
曲線線型曲線顏色標(biāo)記符號(hào)
選項(xiàng)意義選項(xiàng)意義選項(xiàng)意義選項(xiàng)意義選項(xiàng)意
,一3實(shí)線,b,筮色'C'施綠色星號(hào)'pentagram't諄
>__>里1色,.,
虛線綠色'k'lii點(diǎn)號(hào)'o'網(wǎng)
盧線紅紫色紅色,x,叉T7號(hào)M,square,[
點(diǎn)劃線5白色,y'黃色V'diacond'<
‘none'無(wú)線用一個(gè)1x3向俄任意指定,一,△,hexagram,六方
Lr,g,b]紅球筮?:原色0<
用plotyy。函數(shù)可繪制具有兩個(gè)縱坐標(biāo)刻度的圖形:
R例3-2』雙縱坐標(biāo)繪圖:
t=0:.l:2*pi;
y=sin(t);
yl=sin(t).A2;
plotyy(t,y,t,yl);
圖3-2雙縱坐標(biāo)繪圖
3.2二維圖形函數(shù)
除了標(biāo)準(zhǔn)的plot。函數(shù)外,MATLAB還提供了一些其他二維圖形函數(shù),具體調(diào)
用格式和意義請(qǐng)見(jiàn)下表
表3-2MATLAB提供的特殊二維繪圖函數(shù)
表4.4:MATLAB提供的特殊二維曲線繪制函數(shù)
函數(shù)名意義常用調(diào)用格式
bar0.維條形圖barCx,y)
comet()9星狀軌跡圖comet(x,y)
cocpass()羅薇圖con-pass(x,y)
errorbar()誤差限圖形errorbar(x,y,1,u)
feather0羽毛狀圖feather(x,y)
fillO?維坤充函數(shù)fy,C)
hist()直方圖hist(y,n)
loglog0對(duì)數(shù)圖loglog(x,y)
polar()極坐標(biāo)圖polar(x,y)
quiver()磁力戰(zhàn)圖quiver(x,y)
stairs()階梯圖形stairs(x,y)
stem()火柒桿圖stem(x9y)
semilogx()半對(duì)數(shù)圖semilogx(x9y),semilogy(x,y)
極坐標(biāo)曲線繪制:用polar(t,r)函數(shù),其中t為角度向量,r為幅值向量。
K例3-33繪制t在[0,8]區(qū)間繪制r=cos(5t/4)+l/3的極坐標(biāo)曲線。
t=0:.l:8*pi;
r=cos(5*t/4)+l/3;
polar(t,r)
圖3-3極坐標(biāo)繪圖
坐標(biāo)系的分割在MATLAB圖形繪制中是很有特色的,分割方式的標(biāo)準(zhǔn)調(diào)用格式
為
subplot(n,m,k)
其中,n和m為將圖形窗口分成的行數(shù)和列數(shù),k為從左到右、從上到下循序的編
號(hào)。
K例3-4》在窗口上繪制四個(gè)圖形:
x=-2:0.1:2;y=sin(x);
subplot(221);
feather(x,y);xlabel(*(a)feather。')
subplot(222);
stairs(x,y);xlabel(Xb)stairs()f)
subplot(223);
stem(x,y);xlabel(*(c)stem(),)
subplot(224);
fill(x,y,T);xlabel(Xd)fill。')
圖3-4分區(qū)繪圖
K例3-53考察MATLAB的Gauss偽隨機(jī)數(shù)發(fā)生函數(shù)randn()的分布效果,先生成
30,000Gauss偽隨機(jī)數(shù),然后由hist()函數(shù)繪制出該偽隨機(jī)數(shù)的分布函數(shù),并和概率
密度的理論值
=L/x/SSe
相比較。
y=randn(1,30000);
xx=-3.8:0.4:3.8;
zz=hist(y,xx);
zz=zz/(30000*0.4);
bar(xx,zz)
xl=-3.8:0.1:3.8;
y1=l/sqrt(2*pi)*exp(-xl.A2/2);
holdon
plot(xl,yl)
holdoff
圖3-5Gauss偽隨機(jī)數(shù)概率分布圖
holdon命令是為了原來(lái)圖形窗口中補(bǔ)充繪圖而不擦除原有的圖形,繪完圖后最
好馬上用holdoff命令關(guān)閉。
可以使用半對(duì)數(shù)與全對(duì)數(shù)坐標(biāo)系繪圖,函數(shù)為:semilogx(),semilogyO和
loglogQo
K例3-63用半對(duì)數(shù)與全對(duì)數(shù)坐標(biāo)系繪圖:
theta=O:O.l:6*pi;r=cos(theta/3)+l/9;
subplot(2,2,l),polar(theta,r);
subplot(2,2,2);plot(theta,r);
subplot(2,2,3);semilogx(theta,r);grid
subplot(2,2,4);semilogy(theta,r),grid
圖3-6半對(duì)數(shù)坐標(biāo)繪圖
3.3三維圖形函數(shù)
三維曲線繪圖函數(shù)為plot3(),除了多了一個(gè)z坐標(biāo)外,用法與二維曲線繪圖函
數(shù)plot()類(lèi)似。
K例3-71繪制x=sin(t),y=cos(t)和z=t螺旋線的一圈。
t=0:pi/50:2*pi;
x=sin(t);y=cos(t);z=t;
h=plot3(x,y,z,'g-');
set(h,'LineWidth',4*get(h,'LineWidth'));
gridon
圖3-7三維曲線
三維網(wǎng)格圖可以由mesh()函數(shù)繪制,其調(diào)用方法是mesh(x,y,z),其中x,y,z是
網(wǎng)格上的三坐標(biāo)矩陣。通常x和y由meshgrid。函數(shù)生成。
K例3-81考慮下面給出的二元函數(shù),在x,y平面內(nèi)選擇一個(gè)區(qū)域,然后繪制
出
z=/(工-2z)e'uJy
的三維表面圖形。
首先可以調(diào)用meshgrid()函數(shù)生成x和y平面的網(wǎng)格表示。該函數(shù)的調(diào)用意義
十分明顯,即可以產(chǎn)生一個(gè)橫坐標(biāo)起始于-3,中止于3,步距為0.1;縱坐標(biāo)起始于
-2,中止于2,步距為0.1的網(wǎng)格分割。然后由公式計(jì)算出曲面的z矩陣。最后調(diào)
用mesh()函數(shù)繪制曲面的三維表面網(wǎng)格圖形。
[x,y]=meshgrid(-3:0.1:3,-2:0.1:2);
z=(x.A2-2*x).*exp(-x.A2-y.A2-x.*y);
mesh(x,y,z)
圖3-8三維表面圖
MATLAB在三維繪圖時(shí),還可用其它繪圖函數(shù),如surf()、surfl()等,也有不同的
表面著色和插值方法。如shadingflat和shadinginterp兩個(gè)命令將方便得出如下
的圖形。
K例3-93surf()函數(shù)表面著色和插值舉例。
surf(x,y,z),shadingflat
figure
surf(x,y,z),shadinginterp
圖3-9網(wǎng)格與標(biāo)注舉例
3.4圖形可視編輯
從MATLAB5.3版開(kāi)始,提供了方便的圖形編輯功能。在標(biāo)準(zhǔn)的MATLAB圖
形窗口中有一個(gè)“圖形編輯工具條“,典型窗口及編輯工具條如圖3-10(a)所示。圖
形窗口中提供了各種工具,允許用戶(hù)自由地在圖形上添加文字,箭頭、線條等,
還允許用戶(hù)任意地進(jìn)行三維圖的放大、縮小和旋轉(zhuǎn)。
用戶(hù)可以修改圖形對(duì)象和坐標(biāo)系的特征。如果想修改某個(gè)圖形對(duì)象的特征,
則可以在編輯狀態(tài)下,按下工具條中的選擇(箭頭)按鈕,然后單擊欲選對(duì)象,
被選中的對(duì)象上出現(xiàn)若干小黑方塊的控制點(diǎn)時(shí)表示已被選中,雙擊對(duì)象可打開(kāi)它
的屬性編輯窗口,可對(duì)選中對(duì)象的屬性進(jìn)行修改,如圖3-10所示。
圖3-10編輯圖形對(duì)象
單擊空白處可選中坐標(biāo)系,雙擊空白處可打開(kāi)坐標(biāo)系的屬性編輯窗口,可對(duì)
坐標(biāo)系的屬性進(jìn)行修改,如圖3-ll(a)(b)所示。
圖3-11編輯坐標(biāo)系
用戶(hù)還可以利用菜單中的功能進(jìn)行編輯,如圖3-12所示。
圖3-12利用菜單功能編輯
3.5圖象顯示技術(shù)
351圖象的讀出與顯示
圖象的讀出與顯示要用到imread()和imshow()函數(shù),程序如下:
I=imread('football.jpg');
imshow(I);
圖3-13圖象顯示
3.5.2圖象在柱面和上顯示
圖象在柱面上顯示的關(guān)鍵函數(shù)是cylinder和warp()。舉例如下:
I=imread(,football.jpg,);
[x,y,z]=cylinder;
warp(x,y,z,I);
圖3-14圖象在柱面上顯示
3.5.3圖象在球面上顯示
圖象在球面上顯示的關(guān)鍵函數(shù)是sphere。和warp()0舉例如下:
I=imread(,football.jpg,);
[x,y,z]=sphere(50);
warp(x,y,z,I);
圖3-15圖象在球面上顯示
3.5.4圖象在曲面上顯示
圖象在曲面上顯示的關(guān)鍵首先計(jì)算出曲面的空間坐標(biāo),然后用warp()函數(shù)把
圖象顯示在曲面上即可。舉例如下:
[x,y]=meshgrid(-3:0.1:3,-2:0.1:2);
z=(x.A2-2*x).*exp(-x.A2-y.A2-x.*y);
I=imread('football.jpg');
warp(x,y,z,I);
圖3-16圖象在曲面上顯示
3.6動(dòng)畫(huà)與聲音
凡是與時(shí)間有關(guān)的過(guò)程都是動(dòng)態(tài)過(guò)程,動(dòng)態(tài)過(guò)程可以用聲像并茂的多媒體手
段來(lái)表現(xiàn),如動(dòng)畫(huà)在多媒體教學(xué)過(guò)程中就得到廣泛的應(yīng)用。在礦物加工中,可以
通過(guò)監(jiān)測(cè)磨機(jī)的聲音來(lái)分析磨機(jī)的工作狀況好壞,從而對(duì)磨機(jī)進(jìn)行控制。
3.6.1動(dòng)畫(huà)的生成與播放
這里給出一個(gè)生成動(dòng)畫(huà)的程序,將要用到下面兒個(gè)關(guān)鍵函數(shù)peaks(),surfl(),
moviein(),view(),getframe。
I=imread('football.jpg');
[x,y,z]=peaks(30);
warp(x,y,z,I);
axis([-33-33-1010]);
axisoff;
n=80;
m=moviein(n);
fori=l:n
view(-42.5+4*(i-1),30+2*(i-1))
m(:,i)=getframe;
end
播放動(dòng)畫(huà)要用movie。函數(shù)。
movie(m)
圖3-17動(dòng)畫(huà)演示
3.6.2聲音的錄制與播放
下面是聲音的錄制與播放程序,要用到wavrecord(),wavplay。函數(shù)。
fs=11025;
y=wavrecord(5*fs,fs/int16');
plot(y)
wavplay(y,fs);
8000
圖3-18聲音波形
畫(huà)
囹4圖象分析技術(shù)
圖象分析在很多領(lǐng)域得到了越來(lái)越多的應(yīng)用,在礦物加工領(lǐng)域也不例外。為
了讓大家對(duì)圖象分析有初步了解,下面給出圖象分析中若干基本的分析。
關(guān)鍵函數(shù):pixval,impixelinfo,imdistline,impixel,getline,improfile,imhist,
graythresh,im2bw,edge,imfill,imerode,imdilate,xor,line,frame2im,(imgetline,
imdivideline,improline,)bwarea,bweuler。
4.1位置尺寸測(cè)量
K例4-12用鼠標(biāo)獲取象素的位置與測(cè)量目標(biāo)物體尺寸。
用pixval命令測(cè)量程序:
imshowrice.png;
pixval;
執(zhí)行結(jié)果:
圖4-1位置與尺寸測(cè)量
黑條中給出當(dāng)前光標(biāo)的坐標(biāo)和灰度(對(duì)于彩色圖象給出紅綠藍(lán)三個(gè)分量),以及
鼠標(biāo)拖出直線的長(zhǎng)度。
與pixval命令功能相近的有測(cè)量位置顏色的impixelinfo函數(shù)和測(cè)量距離的
imdistline函數(shù),舉例如下:
imshowrice.png;
h=impixelinfo;
set(h;Position',[1503030020]);
imshowrice.png;
imdistline(gca,[121148],[110120]);
4.2選中象素坐標(biāo)與顏色
K例4-2》顯示選中象素的坐標(biāo)和顏色。
用impixel函數(shù)測(cè)量程序:
imshowfootball.jpg;
[x,y,colors]=impixel
圖4-2象素的顏色
執(zhí)行結(jié)果:
x=
9
90
189
227
330
y=
83
85
83
82
79
colors=
246084
314460
245245243
15597109
NaNNaNNaN
注意:impixel的返回變量個(gè)數(shù)必須是0/或3,不能用2個(gè)返回變量,當(dāng)只有一個(gè)返
回變量時(shí),返回的是顏色而不是x坐標(biāo)。若只需要返回坐標(biāo),還可用getline函數(shù),
舉例如下:
imshowfootball.jpg;
[x,y]=getline;
4.3折線象素坐標(biāo)與顏色
K例4-31測(cè)量沿給定折線上像素的坐標(biāo)與顏色。
improfile函數(shù)除了具有impixel和getline函數(shù)的功能外,還能返回折線上像素的坐
標(biāo)和顏色,請(qǐng)看下面程序:
imshowfootball.jpg;
[CX,CY,C,x,y]=improfile
執(zhí)行結(jié)果:
cx=
4
309
CY=
82
8
C(:,:,l)=
47
34
C(:,:,2)=
77
91
C(:,:,3)=
103
120
x=
4
91
91
309
y=
82
83
245
8
若沒(méi)有返回變量,improfile將畫(huà)出沿折線上的顏色分布圖,如圖4-3b所示。
improfile的返回變量可為0,1,3或5,當(dāng)只有一個(gè)返回變量時(shí),返回的是顏色。
可利用返回的直線坐標(biāo)來(lái)切割圖象,大家想想怎么做?
(a)給定折線
Figure2:Profile
(b)無(wú)返回變量時(shí)繪圖輸出
圖4-3沿給定直線象素的灰度分布
4.4灰度直方圖
K例4-41分析米粒的灰度圖象,給出灰度直方圖。
用imhist函數(shù)畫(huà)灰度直方圖程序:
I=imread('rice.png');
subplot(1,2,1);
imshow⑴;title('原圖")
subplot(1,2,2);
imhist(I);title(,灰度直方圖)
執(zhí)行結(jié)果:
圖4-4米粒的灰度直方圖
灰度直方圖右邊的谷點(diǎn)是米粒與背景轉(zhuǎn)變?yōu)楹诎讏D象的最佳閾值,大約為140o
4.5轉(zhuǎn)變?yōu)楹诎讏D象
K例4-52把上題的米粒灰度圖象轉(zhuǎn)變?yōu)楹诎准胺窗讏D象。
可用自動(dòng)閾值函數(shù)graythresh函數(shù)和轉(zhuǎn)換為黑白圖象im2bw函數(shù)轉(zhuǎn)換,負(fù)像只需
對(duì)正像取非運(yùn)算即得,程序如下:
I=imread('rice.png');
level=graythresh(I);
%也可根據(jù)灰度直方圖確定level,不用自動(dòng)閾值函數(shù)graythresh
BW=im2bw(I,level);
subplot(1,2,1);
imshow(BW);titleC米粒的黑白圖象)
BW=~im2bw(I,level);
subplot(1,2,2);
imshow(BW);title(,米粒的反白圖象')
執(zhí)行結(jié)果:
圖4-5米粒的黑白及反白圖象
4.6邊緣檢測(cè)
K例4-6》檢測(cè)米?;叶葓D象的米粒輪廓。
用edge函數(shù)檢測(cè)米粒輪廓程序:
I=imread('rice.png');
BW=edge(I,'canny');
imshow(BW);
執(zhí)行結(jié)果:
圖4.6米粒輪廓圖
edge函數(shù)的第二個(gè)輸入?yún)?shù)為算法選擇,有下面六種算法可選:
sobel
prewitt
roberts
log
zerocross
canny
不同的算法有不同的處理效果,算法的好壞與實(shí)際處理對(duì)象和目的有關(guān),對(duì)于我
們處理的問(wèn)題,canny是最好的。
4.7充填黑洞
K例4-73把上例米粒的圖象邊緣檢測(cè)輪廓圖中完整的米粒充填為白色。
用自動(dòng)填補(bǔ)黑洞的imfil]函數(shù)繼續(xù)處理上例的圖象矩陣BW:
BWO=BW;BW=imfill(BW,'holes');imshow(BW);
執(zhí)行結(jié)果:
圖4-7自動(dòng)填補(bǔ)黑洞后的圖象
也可手工充填黑洞:
BW1=imfill(BWO);imshow(BW1);
%若充填不完全可重復(fù)執(zhí)行上行繼續(xù)充填
執(zhí)行結(jié)果:
圖4-8手工充填部分黑洞后的圖象
4.8腐蝕與膨脹
在圖4-7中一些不完整米粒的輪廓線尚未去掉,可以通過(guò)一次腐蝕imerode與
膨脹imdilate操作去掉。
這里有涉及到鄰域的操作,我們只簡(jiǎn)單地介紹常用的4-鄰域和8-鄰域。在3X3
矩陣中心像素周?chē)?的位置都是中心像素的鄰域。還可以自己定義其它的鄰域
或更大的鄰域,比如定義鄰域?yàn)閑ye(5)0
4-鄰域8-鄰域
010111
111111
010111
腐蝕操作:
BW2=BW;
SE=[010;111;010];
BW=imerode(BW,SE);
imshow(BW);
執(zhí)行結(jié)果:
圖4-9腐蝕后的圖象
膨脹操作:
BW=imdilate(BW,SE);
imshow(BW);
執(zhí)行結(jié)果:
圖4-10膨脹后的圖象
經(jīng)過(guò)一次腐蝕與膨脹操作,確實(shí)去掉了多余的輪廓線,但是要保留的完整米
粒是否能夠在一次腐蝕和膨脹操作后恢復(fù)到原來(lái)的形狀,可以用操作前后兩圖像
的異或xor操作來(lái)檢查,結(jié)果表明用4-鄰域是能夠恢復(fù),用8-鄰域則恢復(fù)較差,
大家可以自行檢驗(yàn)。
異或操作:
BW3=xor(BW,BW2);
imshow(BW3);
執(zhí)行結(jié)果:
Figure1
圖4-11膨脹后的圖象
圖4-10和圖4-11實(shí)際上就是圖4-7的分解為保留的部分和去掉的部分。
4.9圖像分割
粘連在一起的米粒必須分割開(kāi),否則不能正確計(jì)數(shù),可用前面介紹的improfile
函數(shù)獲得折線上的坐標(biāo)來(lái)實(shí)現(xiàn)分割,也可以用鼠標(biāo)定位點(diǎn)坐標(biāo)的來(lái)實(shí)現(xiàn)分割(兩
點(diǎn)連線上各點(diǎn)的坐標(biāo)需要插值),如improfile、impixel和getline函數(shù)都可用來(lái)
獲得一系列的鼠標(biāo)定位點(diǎn)。
若要保證在8-鄰域下被認(rèn)為是分割開(kāi)的,分割線的像素總是沿上下左右方向
連續(xù)延伸(圖4-12),不能有跳躍。若有沿斜線方向延伸,在8-鄰域下物體被認(rèn)為
是聯(lián)系在一起的,沒(méi)有被真正分割開(kāi);但此時(shí)在4-鄰域下被認(rèn)為是分割開(kāi)的。
100111111110111111
110011111111011111
111001111111101111
111100111111110111
111110011111111011
8-鄰域割斷4-鄰域割斷
Figure1EDI回區(qū)]
圖4-12兩種鄰域下割斷的分割線
8-鄰域下,左圖被識(shí)別為兩個(gè)物體,右圖在被識(shí)別為內(nèi)部有3個(gè)黑洞的一個(gè)物體,
與邊界相連的黑洞被認(rèn)為是背景的部分,自動(dòng)補(bǔ)洞只會(huì)充填不靠邊界的三個(gè)小
黑洞,與邊界相連的黑洞不會(huì)被充填。
設(shè)計(jì)程序要求可以連續(xù)進(jìn)行分割,分割線的顏色取決于起點(diǎn)的顏色,當(dāng)不需
要繼續(xù)分割時(shí),可在起點(diǎn)直接雙擊鼠標(biāo)左鍵或單擊鼠標(biāo)右鍵退出(即只有一個(gè)坐
標(biāo)點(diǎn)時(shí)退出)。
可用鼠標(biāo)定位點(diǎn)的坐標(biāo)來(lái)實(shí)現(xiàn)分割,getline、impixel和improfile都可以獲得鼠
標(biāo)定位點(diǎn)坐標(biāo)。對(duì)于只保證在4-鄰域下割斷的場(chǎng)合,用line>frame2im和getframe
函數(shù)實(shí)現(xiàn)可以連續(xù)分割的簡(jiǎn)單程序如下。
BW4=BW;
imshow(BW);
[X,Y]=getline;
%[X,Y,C]=impixel;
%[CX,CY,C,X,Y]=improfile;
whilelength(X)>1
ifBW(round(Y(l)),round(X(l)))==0,C='k';else,C='w';end
line(X,Y,'Color',C)
MV=frame2im(getframe);
BW=MV(1:end-1,1:end-1,1)>0;
imshow(BW);
[X,Y]=getline;
end
如果原來(lái)的分割線旁偏移一個(gè)像素位置再畫(huà)一條平行的分割線,就可以保證
在8-鄰域下割斷。下面自編的imgetline函數(shù)可通過(guò)第二個(gè)輸入?yún)?shù)n實(shí)現(xiàn)4-鄰
域或8-鄰域割斷的連續(xù)分割,n=4時(shí)為4-鄰域割斷,其它情況(包括缺省)皆為
8-鄰域割斷。
BW=imgetline(BW)
functionBW=imgetline(BW,n)
%IMGETLINEisafunctionofdrawinglinesinan%image.
%BW=IMGETLINE(BW,n)drawlinesinabinaryimage%BW,4-neibor
%regioncanbeselectedbyn=4,otherwise8-neiborregionisselected.
ifnargin-=2,n=8;elseifn?=4,n=8;end
[X,Y]=getline;
whilelength(X)>1
ifBW(round(Y(l)),round(X(l)))==0,C=,k,;else,C=,w,;end
line(X,Y,Color',C)
ifn==8
Xl=X(2:end)-X(l:end-l);
Yl=Y(2:end)-Y(l:end-l);
YX=abs(Yl./Xl)>l;
fori=l:length(X)-l
ifYX(i)>l
Y(i)=Y(i)+l;
Y(i+l)=Y(i+l)+l;
else
X(i)=X(i)+l;
X(i+l)=X(i+l)+l;
end
end
line(X,Y;Color\C)
end
MV=frame2im(getframe);
BW=MV(1:end-1,1:end-1,1)>0;
imshow(BW);
fX,Y]=getline;
end
若在分割程序中不使用line>frame2im和getframe函數(shù),也可以用下面自編
的imdivideline函數(shù)實(shí)現(xiàn)imgetline函數(shù)的功能,兩者產(chǎn)生的分割線一般會(huì)有微小
差別。
BW=imdivideline(BW);
functionBW=imdivideline(BW,n)
%IMDIVIDELINEisafunctionofdrawinglinesinanimage.
%BW=IMDIVIDELINE(BW,n)drawlinesinabinaryimage%BW0,4-neibor
%regioncanbeselectedbyn=4,otherwise8-neiborregionisselected.
ifnargin-=2,n=8;elseifn?=4,n=8;end
[X,Y]=getline;
whilelength(X)>l
L=l;
Xk=round(X(L));
Yk=round(Y(L));
C=BW(Yk,Xk);
whileL<length(X)
T=(Y(L+1)-Y(L))/(X(L+l)-X(L));
ifabs(T)>l
fork=round(Y(L)):sign(Y(L+l)-Y(L)):round(Y(L+l))
ifn==8,BW(k,Xk)=C;end
ifabs((k-Y(L))/T+X(L)-Xk)>0.5
Xk=Xk+sign(X(L+1)-Xk);
end
BW(k,Xk)=C;
end
else
fork=round(X(L)):sign(X(L+l)-X(L)):round(X(L+l))
ifn==8,BW(Yk,k)=C;end
ifabs((k-X(L))*T+Y(L)-Yk)>0.5
Yk=Yk+sign(Y(L+l)-Yk);
end
BW(Yk,k)=C;
end
end
L=L+1;
end
imshow(BW);
[X,Y]=getline;
end
下面是用improfile函數(shù)自編實(shí)現(xiàn)的4-鄰域或8-鄰域下割斷的improline函數(shù)及
程序,第二個(gè)輸入?yún)?shù)n=4時(shí)為4-鄰域割斷,其它情況(包括缺省)皆為8-鄰
域割斷,與前兩個(gè)自編函數(shù)產(chǎn)生的分割線也會(huì)有微小差別。
BW=improline(BW);
functionBW=improline(BW,n)
%IMPROLINEisafunctionofdrawinglinesinan%image.
%BW=IMPROLINE(BW,n)drawlinesinabinaryimage%BW,4-neibor
%regioncanbeselectedbyn=4,otherwise8-neiborregionisselected.
ifnargin-=2,n=8;elseifn-=4,n=8;end
[CX,CY,C]=improfile;
whilelength(CX)>l
k=l;
Xk=round(CX(k));
Yk=round(CY(k));
C=BW(Yk,Xk);
whilek<length(CX)
k=k+1;
ifabs(CX(k)-Xk)>0.5
Xk=Xk+sign(CX(k)-Xk);
ifn==8,BW(Yk,Xk)=C;end
end
ifabs(CY(k)-Yk)>0.5
Yk=Yk+sign(CY(k)-Yk);
ifn==8,BW(Yk,Xk)=C;end
end
ifn==4,BW(Yk,Xk)=C;end
end
imshow(BW);
[CX,CY,C]=improfile;
end
執(zhí)行結(jié)果:
圖4-13分割粘連的米粒后的圖象
4.10面積與計(jì)數(shù)
可以用bwarea函數(shù)統(tǒng)計(jì)黑白圖象中白色物體占有的總像素?cái)?shù),用bweuler歐
拉數(shù)函數(shù)統(tǒng)計(jì)黑白圖象中孤立白色物體的個(gè)數(shù),它有第二個(gè)可選參數(shù),為4時(shí)
按4-鄰域割斷識(shí)別獨(dú)立的物體,為8時(shí)按8-鄰域割斷識(shí)別獨(dú)立的物體,缺省值
為8o對(duì)于圖4-12中4-鄰域割斷的圖形,按8-鄰域割斷識(shí)別得到的歐拉數(shù)為-2
(一個(gè)物體減去三個(gè)黑洞)。由此就能計(jì)算出每個(gè)白色物體占有的平均像素?cái)?shù)。
黑白圖象的歐拉數(shù)定義為:
歐拉數(shù)=白色物體的個(gè)數(shù)-白色物體內(nèi)黑色孔洞的個(gè)數(shù)
為了準(zhǔn)確檢測(cè)出白色物體的個(gè)數(shù),事先必須填補(bǔ)白色物體內(nèi)部的黑洞,用4-
鄰域割斷后不應(yīng)再補(bǔ)洞,因?yàn)檠a(bǔ)洞會(huì)使分割線消失,而8-鄰域割斷后補(bǔ)洞不會(huì)影
響分割線。當(dāng)白色物體內(nèi)部沒(méi)有黑洞時(shí),歐拉數(shù)就等于白色物體個(gè)數(shù)。
程序:
%檢測(cè)白色物體個(gè)數(shù)
N=bweuler(BW,4)
%檢測(cè)白色區(qū)域總的象素個(gè)數(shù)
A=bwarea(BW)
%計(jì)算每個(gè)物體的平均象素個(gè)數(shù)
a=A/N
執(zhí)行結(jié)果:
N=
70
A=
1.5447e+004
a=
220.6768
歐拉數(shù)函數(shù)的第一個(gè)輸入?yún)?shù)為填補(bǔ)過(guò)黑洞的黑白圖象矩陣,第二個(gè)參數(shù)為
鄰域選擇,可選為4和8對(duì)應(yīng)于4-鄰域和8-鄰域,缺省為8-鄰域。4-鄰域比8-
鄰域能更好區(qū)分粘連的顆粒。
[[例4-82檢測(cè)米粒圖像(文件名:rice.png)中米粒的個(gè)數(shù)及每個(gè)米粒的平均面積
(以像素為單位)。
下面程序是完全按照處理米粒的方法編寫(xiě)的程序,只是用了分區(qū)繪圖并加了
文字說(shuō)明,仍不夠完善,大家可以修改得更好。
I=imread(Tice.png');
BW=edge(I,,canny,);
subplot(2,2,1);imshow(BW);
xlab&C邊緣檢測(cè))
BW=imfill(BW,,holes,);
subplot(2,2,2);imshow(BW);
xlabelC自動(dòng)填補(bǔ)黑洞)
BW2=BW;
SE=[010;l1l;010];
BW=imerode(BW,SE);
BW=imdilate(BW,SE);
subplot(2,2,3);imshow(BW);
xlabelC腐蝕膨脹后圖象)
BW3=xor(BW,BW2);
subplot(2,2,4);imshow(BW3);
xlabel(檢查腐蝕膨脹效果)
figure;imshow(BW);
xlabelC分割粘連顆粒)
[X,Y]=getline;
whilelength(X)>l
ifBW(round(Y(1)),round(X(1)))==O,C='k';else,C='w';end
line(X,Y,'Color',C)
MV=frame2im(getframe);
BW=MV(l:end-l,l:end-1,1)>0;
imshow(BW);
fX,Y]=getline;
end
N=bweuler(BW,4)
A=bwarea(BW)
a=A/N
執(zhí)行結(jié)果:
N=
70
A=
1.5450e+004
a=
220.7089
執(zhí)行結(jié)果:
圖4-14求米粒圖像分析的中間過(guò)程
這是用米粒的處理程序處理的,這幅圖像有兩處需要分割,同時(shí)有一個(gè)米粒
輪廓線不封閉和兩個(gè)與邊界顆粒粘連的顆粒被去掉了,大家考慮能否修改程序,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025河南建筑安全員-A證考試題庫(kù)附答案
- 貴州大學(xué)《醫(yī)學(xué)統(tǒng)計(jì)學(xué)規(guī)培》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴州財(cái)經(jīng)職業(yè)學(xué)院《火災(zāi)動(dòng)力學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025福建建筑安全員考試題庫(kù)
- 貴陽(yáng)學(xué)院《保險(xiǎn)投資學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 硅湖職業(yè)技術(shù)學(xué)院《植物造景技術(shù)(一)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣州幼兒師范高等專(zhuān)科學(xué)?!稛o(wú)人機(jī)結(jié)構(gòu)與系統(tǒng)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年貴州省安全員B證考試題庫(kù)及答案
- 2025江蘇建筑安全員《B證》考試題庫(kù)及答案
- 2025年河南省安全員《C證》考試題庫(kù)及答案
- 工程機(jī)械租賃服務(wù)方案及保障措施范本
- SCI論文寫(xiě)作課件
- 封條模板A4直接打印版
- 春節(jié)停工報(bào)告完整版3頁(yè)
- 振動(dòng)篩使用說(shuō)明書(shū)..(共10頁(yè))
- (完整版)展廳展館博物館美術(shù)館設(shè)計(jì)標(biāo)招標(biāo)評(píng)分細(xì)則及打分表
- [宋小寶小品甄嬛后傳臺(tái)詞]甄嬛歪傳小品劇本臺(tái)詞范本
- 扭扭棒手工PPT課件
- 曲式分析演唱技巧情感運(yùn)用
- 古建筑白蟻危害及防控現(xiàn)狀
- 建筑裝飾裝修施工組織設(shè)計(jì)方案(完整版)
評(píng)論
0/150
提交評(píng)論