MATLAB基本的使用方法
1.读取图像:用imread函数读取图像文件,文件格式可以是TIFF、JPEG、GIF、BMP、
PNG等。比如
>>f=imread('');
读进来的图像数据被保存在变量f中。尾部的分号用来抑制输出。如果图片是彩色的,可
以用rgb2gray转换成灰度图:
>>f=rgb2gray(f);
然后可以用size函数看图像的大小
>>size(f)
如果f是灰度图像,则可以用下面的命令把这个图像的大小赋给变量M和N
>>[M,N]=size(f);
用whos命令查看变量的属性
>>whosf
2.显示图像:用imshow显示图像
imshow(f,G)
其中f是图像矩阵,G是像素的灰度级,G可以省略。比如
>>imshow(f,[100200])
图像上所有小于等于100的数值都会显示成黑色,所有大于等于200的数值都会显示成
白色。pixval命令可以用来查看图像上光标所指位置的像素值。
pixval
例如
>>f=imread('ro_');>>whosf>>imshow(f)
如果要同时显示两幅图像,可以用figure命令,比如
>>figure,imshow(g)
用逗号可以分割一行中的多个命令。imshow的第二个参数用一个空的中括号:
>>imshow(h,[])可以使动态范围比较窄的图像显示更清楚。
3.写图像。用imwrite写图像
imwrite(f,'filename')
文件名必须包括指明格式的扩展名。也可以增加第三个参数,显式指明文件的格式。比如
>>imwrite(f,'patient10_','tif')
也可以写成
>>imwrite(f,'patient10_')
还可以有其他参数,比如jepg图像还有质量参数:
>>imwrite(f,'','quality',q)
q是0到100之间的一个整数。对比不同质量的图像效果。用imfinfo命令可以查看一个
图像的格式信息,比如
>>
可以把图像信息保存到变量中
>>K=imfinfo('');>>image_bytes=**th/8;>>
compresd_btyes=ze;>>compression_ratio=image_bytes/compresd_bytes
4.数据类型。MATLAB的数据类型包括:
double双精度浮点uint8无符号8位整数uint16无符号16位整数uint32无符号32位整数
int8有符号8位整数int16有符号16位整数int32有符号32位整数single单精度char字符
logical逻辑型(二值)
数据类型转换
B=data_class_name(A)
比如
>>C=[1.41.5]>>D=uint8(C)
图像类型分为:
Intensityimage灰度图Binaryimage二值图Indexedimage索引图RGBimage彩色图
在灰度图中每个像素可以是整型、浮点型或者逻辑型。图像类型的像素类型可以转换
functiontofromim2uint8uint8logical,uint8,uint16,doubleim2uint16uint16
logical,uint8,uint16,doublemat2graydoubledoubleim2doubledouble
logical,uint8,uint16,doubleim2bwlogicaluint8,uint16,double
比如
g=mat2gray(A,[Amin,Amax]);g=mat2gray(A);g=im2double(h);g=im2bw(f,T)其中A
是浮点型的图像,Amin和Amax是浮点数的范围,h和f是任意类型的图像,T是分割的阈值。
5.数组(向量)索引:创建向量(数组):
>>v=[135791113]
用小括号对向量进行索引(取数组中的某个元素):
>>v(2)
转置(将行向量通过转置变成列向量):
>>w=v.'
取向量其中的一部分:
>>v(1:3)第1个到第3个>>v(2:4)>>v(3:end)第3个到最后一个>>v(1:end)>>v(:)全
部>>v(1:2:end)第1个到最后一个,每次增加2>>v(end:-2:1)最后一个到第1个,每次减2
其中end总是表示最后一个。
>>x=linspace(1,5,10)>>v([145])linspace函数产生一个范围内的平均分布。
6.矩阵索引:创建矩阵
>>A=[123;456;789]
取矩阵中的一个元素
>>A(2,3)
取矩阵中的一行或者一列
>>C3=A(:,3)>>R2=A(2,:)
取矩阵中某些行某些列
>>T2=A(1:2,1:3)
对矩阵中某些元素进行赋值:
>>B=A;>>B(:,3)=0
用end表示最后一行或者最后一列:
>>A(end,end)最后一行最后一列>>A(end,end-2)最后一行倒数第三列>>A(2:end,
end:-2:1)第2行到最后一行,最后一列到第一列,每次减2>>E=A([13],[23])第1、3行,
第2、3列>>D=logical([100;001;000])>>A(D)取A中由D指定的位置上的元素>>v=
T2(:)把矩阵变成一个向量>>s=sum(A(:))求和>>sum(sum(A))
可以把矩阵操作用在图像上
>>f=imread('filename');>>fp=矩阵列倒转>>imshow(fp)>>fc=>>imshow(fc)>>fs
=>>imshow(fs)>>plot(f(512,:))
矩阵可以是多维的,用size看矩阵大小,用ndims命令常看矩阵的维数
>>size(A,1)>>ndims(A)
7.一些常用的矩阵
zeroes(M,N)ones(M,N)true(M,N)fal(M,N)magic(M)rand(M,N)randn(M,N)
其中M、N表示矩阵的行数和列数。比如
>>A=5*ones(3,3)>>magic(3)>>B=rand(2,4)
8.函数:可以把一系列的MATLAB语句或者一个带参数的函数放在扩展名叫做m的文
件中。一个带函数的m文件有一下部分组成
函数定义行H1行帮助部分函数体注释
函数定义行的格式是
function[outputs]=name(inputs)
比如要写一个函数计算两个图像的和以及乘积
function[s,p]=sumprod(f,g)
其中f和g是输入的图像,而s是和,p是乘积。返回值用中括号括起来,如果返回值只
有一个,可以省略中括号。如果函数没有输出,则中括号和等号都可以省略。函数名字的命名
规则和C语言是相同的。定义好的函数可以在命令行调用:
>>[s,p]=sumprod(f,g);
也可以被其它函数调用。如果只有一个返回值,调用时中括号也是可以省略的,比如
>>y=sum(x);
H1行是文本的第一行,是一个单行的注释,紧跟在函数定义行后面,之间不能有空行。
比如
%SUMPRODComputesthesumandproductoftwoimages.
百分号开始的文字表示注释。当使用帮助命令
>>helpfunction_name
时,这个H1行会被首先显示出来。如果使用lookfor命令,则会在所有H1行中查找指定
的关键字。这一行应该提供这个函数功能的一个概述。帮助部分是紧跟在H1后的文本块,中
间没有空行,用来提供对这个函数更详细的帮助说明。在使用help命令时会显示所有这部分内
容。这部分内容由注释语句构成,全部由%开始。接下来第一个非注释语句表示函数体的开始。
函数体包含进行计算的语句和给返回值赋值的语句。函数题中的所有注释(百分号开始的行)
被认为是普通的注释,不是H1或者帮助部分。m文件可以用任何文本编辑器创建和编辑,只
要用.m扩展名保存在MATLAB可以搜索到的路径里面。另一个创建和编辑函数的方法是在命
令行输入edit命令,比如
>>editsumprod这命令会编辑已经存在的sumprod.m文件,如果没有则自动在当前目录
中创建一个sumprod.m并开始编辑。
9.运算符。运算符可以分为算术运算符,关系运算符和逻辑运算符。算术运算符分为矩
阵算术运算符和数组算术运算符。
+矩阵和数组加法plus(A,B)a+b,A+B-矩阵和数组减法minus(A,B)a-b,A-B.*数组乘法
times(A,B)C=A.*B,意味着C(I,J)=A(I,J)*B(I,J)*矩阵乘法mtimes(A,B)A*B,表示线性代数
中的矩阵运算,或者a*A./数组右除rdivide(A,B)C=A./B,意味着C(I,J)=A(I,J)/B(I,J).数组左
除ldivide(A,B)C=A.B,意味着C(I,J)=B(I,J)/A(I,J)/矩阵右除mrdivide(A,B)A/B意味着
A*inv(B),inv是矩阵求逆矩阵左除mldivide(A,B)AB意味着inv(A)*B.^数组指数power(A,
B)C=A.^B,意味着C(I,J)=A(I,J)^B(I,J)^矩阵指数mpower(A,B)请查看帮助.'向量和矩阵转置
transpo(A)A.''复数的共轭ctranspo(A)A'+单目加号uplus(A)+A与0+A相同-单目负
号uminus(A)-A与0-A相同
图像处理工具包还提供其他一些算术运算
imadd两个图像相加,或者一个图像加上一个常量imsubstract两个图像相减,或者一个
图像减掉一个常量immultiply两个图像相乘,或者一个图像乘上一个常量imdivide两个图像相
除,或者一个图像除以一个常量imabsdiff两个图像的差的绝对值imcomplement求一个图像
的反色图inlincomb求一组图像的线性组合
关系运算符包括
<<=>>===~=
关系运算符的结果是逻辑型的矩阵,比如
>>A=[123;456;789]>>B=[024;356;349]>>A==B>>A>=B
如果关系运算符两边都是矩阵,则要求两边的矩阵是同样大小的。或者一边是矩阵一边是
常数,或者两边都是常数,那也是可以。
>>A>3>>3~=4
逻辑运算符包括与、或、非三个运算
&AND|OR~NOT
在matlab中非0被认为是真,0被认为是假。比如
A=[120;045]B=[1-23;011]>>A&B
MATLAB还有其它一些逻辑运算函数:
xor异或all如果一整列都是真,则结果是真any如果一整列只要有一个是真,则结果是
真
比如
>>xor(A,B)>>all(A)>>any(A)>>all(B)>>any(B)
一些重要的常量
anpsi(或者j)NaN或者nanpirealmaxrealmincomputerversion
MATLAB中一般常量的写法
3-990.000019.63972381.60210e-206.02252e231i-3.14159j3e5j
10.控制流。包括
ifif和el,elif组合,条件执行一组语句for指定次数重复执行一组语句while按条件反复
执行一组语句break终止for或者while循环continue马上开始下一次for或者while循环
switchswitch和ca,otherwi结合,按照条件值的不同执行不同的语句块return终止当前函
数,返回到调用它的地方try...catch捕获异常状况
if语句
ifexpression1statements1elifexpression2statements2elstatements3end
for循环
forindex=start:increment:endstatementnd
比如
count=0;fork=0:0.1:1count=count+1end
while循环
whileexpressionstatementnd
比如
a=10;b=5;whileaa=a-1;whilebb=b-1;endend
switch语句
switchswitch_expressioncaca_expressionstatementsca{ca_expression1,
ca_expression2}statementsotherwistatementnd
比如
switchnewclassca'uint8'g=im2uint8(f);ca'uint16'g=im2uint16(f);ca'double'
g=im2double(f);otherwierror('Unknownorimproperimageclass.')end
例子:写一个函数计算一幅灰度图像所有像素的平均值
functionav=average(A)%AVERAGEComputestheaveragevalueofanarray%AV=
AVERAGE(A)computestheaveragevalueofinputarray,A,%whichmustbea1Dor2D
array.%s(A)>2error('Thedimensionsoftheinputcannot
exceed2.')end%Computestheaverageav=
例子:比较各种不同的JPEG质量下的图像质量
forq=0:5:100filename=sprintf('ries_%',q);imwrite(f,filename,'quality',
q);end
其中sprintf语句和c语言的fprintf语句用法类似。例子:写一个函数从一个图像中取出
一个矩形的子图。
functions=subdim(f,m,n,rx,cy)%SUBDIMExtractsasubimage,s,fromagiven
image,f.%Thesubimageisofsizem-by-n,andthecoordinatesofitstop,left%cornerare(rx,
cy).s=zeros(m,n);rowhigh=rx+m-1;colhigh=cy+n-1;xcount=0;forr=rx:rowhigh
xcount=xcount+1;ycount=0;forc=cy:colhighycount=ycount+1;s(xcount,ycount)=f(r,
c);endend实际上这个功能可以用一个matlab语句就可以实现了。
11.循环优化。一些循环可以被转换成同样向量计算来代替,比如f(x)=Asin(x/2pi),生成
一个向量包含一组函数的值:
forx=1:Mf(x)=A*sin((x-1)/(2*pi));end
可以用下面两个语句来代替
x=f=A*sin(x/2(*pi))
向量运算要比循环快得多。对于二维的情况,MATLAB提供了一个meshgrid函数
[C,R]=meshgrid(c,r)
比如
>>r=[012];>>c=[01];>>[C,R]=meshgrid(c,r)>>h=R.^2+C.^2
例子:f(x,y)=Asin(ux+vy),生成一个矩阵,包含这个函数的值:
function[rt,f,g]=twodsin(A,u0,v0,M,N)%TWODSINcompareforloopsvs
vectorization%Thecomparisionisbadonimplementingthefunction%f(x,y)=
Asin(u0x+v0y)forx=0,1,2,...,M-1,and%y=0,1,2,...,utstothefunction
are%r=1:Mu0x=u0*(r-1);forc=1:Nv0y=
v0*(c-1)f(r,c)=A*sin(u0x+v0y);endendt1=toc;ticr=c=[C,R]=meshgrid(c,r);g=
A*sin(u0*R+v0*C)t2=toc;rt=t1/t2;
运行这个例子可以看出,向量计算至少比循环要快30倍。如果只是针对图像的一部分进
行操作,可以简单的提取出来,比如
rowhigh=rx+m-1;colhigh=cy+n-1;s=同样功能的程序,这个写法比前面例子看到
的写法要快1000倍。
12.用户交互。函数disp用来提示用户一些信息。比如
>>A=[12;34];>>disp(A)>>sc='DigitalImageProcessing.';>>disp(sc)>>disp('Thisis
anotherwaytodisplaytext.')
input函数用来提示用户输入某些值:
t=input('message')
这个函数可以显示message,并等待用户输入一个值,并存到t中。输入的值可以是
MATLAB允许的任何类型的值。而如下的格式只接受字符串输入
t=input('message','s')
如果字符串中包含的都是数字,则可以用函数str2num进行转换
n=str2num(t)
比如
>>t=input('Enteryourdata:','s')>>class(t)>>size(t)>>n=str2num(t)>>size(n)>>
class(n)
如果混合输入字符串和数值,可以全部按照字符串读入,再使用字符串处理函数strread,
比如:
>>t='12.6,x2y,z';>>[a,b,c]=strread(t,'%f%q%q','delimiter',',')>>d=char(b)其中%f
表示浮点数,%q表示字符串。delimiter参数表示分割符。函数strcmp用来比较字符串,如果
两个字符串相等返回真,否则返回假。lower函数可以把字符串中的大写字母全部变成小写,
upper函数可以把字符串中所有小写字母全部变成大写。
数组和结构体。Cell数组是指数组的元素本身还是一个数组,比如
>>c={'gau',[10;01],3}>>c{1}>>c{2}>>c{3}
结构体和Cell数组类似,但是其中的元素是用一个名字去访问的,比如
>>_string='gau';>>=[10;01];>>=3;>>
实验任务
没有提供一个函数来确定数组的每个元素是不是整数(即...,-2,-1,0,1,2,...)。
写一个函数来实现这个功能,并满足下面的格式:
functionI=isinteger(A)%ISINTEGERDetermineswhichelementsofanarrayareintegers.%I
=ISINTEGER(A)returnsalogicalarray,I,ofthesamesize%asA,with1s(TRUE)inthe
locationscorrespondingtointegers%(i.e.,...-2-1012...)inA,and0s(FALSE)
elwhere.%Amustbeanumericarray.要求不能使用while或者for循环。提示:使用floor
函数。如果你要做到能够处理复数,那么可以使用real和imag函数。
没有提供一个函数用来确定数组的每个元素是不是偶数
(即...,-4,-2,0,2,4,...)。写一个函数来实现这个功能,并满足下面的格式:
functionE=iven(A)%ISEVENDetermineswhichelementsofanarrayareevennumbers.%
E=ISEVEN(A)returnsalogicalarray,E,ofthesamesizeasA,%with1s(TRUE)inthe
locationscorrespondingtoevennumbers%(i.e.,...-3,-1,0,2,4,...)inA,and0s(FALSE)
elwhere.%Amustbeanumericarray.要求不能使用while或者for循环。提示:使用floor
函数。
没有提供一个函数用来确定数组的每个元素是不是奇数(即...,−3,−1,1,3,...)。
写一个函数实现这个功能,并满足下面的格式:
functionD=isodd(A)%ISODDDetermineswhichelementsofanarrayareoddnumbers.%E
=ISODD(A)returnsalogicalarray,D,ofthesamesizeasA,%with1s(TRUE)inthe
locationscorrespondingtooddnumbers%(i.e.,...-3,-1,1,3,...)inA,and0s(FALSE)
elwhere.%Amustbeanumericarray.要求不能使用while或者for循环。提示:使用floor
函数。
4.写一个函数满足下面的规定:
functionH=imcircle(R,M,N)%IMCIRCLEGeneratesacircleinsidearectangle.%H=
IMCIRCLE(R,M,N)generatesacircleofradiusRcentered%onarectangleofheightMand
naryimagewith%ean
integer>=1.你的程序应该检查R的合理性,使它能够在矩形的内部。要求不能使用for或者
while循环。提示:使用函数meshgrid和floor函数。
5.这个实验主要目的是学习如何显示和改变目录,并利用目录信息来读取图像。写一个
函数满足下面的规定:
function[I,map]=imagein(path)%IMAGEINReadimageinfromcurrent-workingorspecified
directory.%I=IMAGEINdisplaysawindowcontainingallthefilesinthe%currentdirectory,
andsavesinItheimagelectedfromthe%currentdirectory.%[I,MAP]=IMAGEINvariable
MAPisrequiredtobeanoutput%argumentwhentheimagebeingreadisanindexed
image.%[...]=IMAGEIN('PATH')isudwhentheimagetoberead%residesinaspecified
mple,theinput%argument'C:MY_WORKMY_IMAGES'opensawindow
showing%thecontentsofdirectoryMY_electedfrom%thatdirectoryis
readinasimageI.提示:使用在线帮助来熟悉cd,pwd,uigetfile函数的使用。或者也可以采
用fullfile函数来代替cd函数。
本文发布于:2022-12-08 06:09:12,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/64263.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |