首页 > 试题

matlab取绝对值

更新时间:2022-12-08 06:09:12 阅读: 评论:0

初二数学辅导书-桃花心木的资料


2022年12月8日发(作者:波斯猫儿)

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 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图