Matlab学习(一):数字图像处理大作业用到的函数
1.dlmread——将以 ASCII 码分隔的数值数据读入到矩阵中
dt = dlmread(\'data1.txt\',\' \',1,0); dt = dt(:,1); save(\'data2.txt\',\'dt\',\'-ascii\');
2.mean
mean(A) % 求各行的均值 mean(A,2) % 求各列的均值
3.min/max
*dim=1 返回行向量,每列的最大值
dim=2 返回列向量,每行的最大值
max(A,[],dim)
4.round 四舍五入取整(向最近的整数取整)
5.struct
s = struct(\'field1\',values1,\'field2\',values2,...)
这是在建立结构体的时候就赋值,values1,values2就是针对field1,field2所赋的值。field1,field2是域名称。
*“true”或”false”直接创建逻辑数组
6.nargin 判断输入参数个数
7.norm
1、如果A为矩阵 n=norm(A) 返回A的最大奇异值,即max(svd(A)) n=norm(A,p) 根据p的不同,返回不同的值p 1 返回A中最大一列和,即max(sum搜索(abs(A))) 2 返回A的最大奇异值,和n=norm(A)用法一样 inf 返回A中最大一行和,即max(sum(abs(A’))) ‘fro’ A和A‘的积的对角线和的平方根,即sqrt(sum(diag(A\'*A))) 2、如果A为向量,norm(A,p)返回向量A的p范数。 即返回 sum(abs(A).^p)^(1/p),对任意 1<p<+∞. norm(A)返回向量A的2范数,即等价于norm(A,2)。 norm(A,inf) 返回max(abs(A)) norm(A,-inf) 返回min(abs(A))
8.函数句柄
函数句柄:是包含了函数的路径、函数名、类型以及可能存在的重载方法。
函数句柄必须通过专门的定义创建的,而一般的图像的句柄是自动建立的。
创建函数句柄使用@或者str2func命令创建
[email=h_fun=@fun]h_fun=@fun[/email];
h_fun=str2func(\’fun\’);
比如说sin函数,[email=h_sin=@sin]h_sin=@sin[/email]; h_sin=str2func(\’sin\’);
执行sin函数 feval
feval(\’sin\’,pi/2)
ans =
1
那么使用函数句柄有什么好处呢?
1、提高运行速度。因为matlab对函数的调用每次都是要搜索所有的路径,从set path中我们可以看到,路径是非常的多的,所以如果一个函数在你的程序中需要经常用到的话,使用函数句柄,对你的速度会有提高的。
2、使用可以与变量一样方便。比如说,我再这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝过来。因为你创建的function handles中,已经包含了路径,比如说我创建了一个fun
h_fun=str2func(\’rei\’);
可以用functions来查看这个function,结果果然已经包括了路径。
functions(h_fun)
ans =
function: \’rei\’
type: \’simple\’
file: \’G:\program\serial232\rei.m\’
9.arrayfun
利用arrayfun函数可以避免无谓的循环,从而大大提高代码的简介性。
1、A=ARRAYFUN(FUN, B)
FUN是函数句柄,对B中的每一个元素调用FUN函数(计算顺序随意),结果存放于A中,size(A)==size(B)
FUN函数可接受numeric, logical, char, struct, cell的自变量类型。
2、[A, B, …] = ARRAYFUN(FUN, C, …)
FUN函数的返回值是一个向量,对B中的每一个元素调用FUN函数,计算结果放在A,B…中。
3、 A = ARRAYFUN(FUN, B, C, …)
FUN函数接受参数不唯一,分别调用B, C, …中的元素,A(i,j…)=Fun(B(i,j…),C(i,j,…)…),
B,C…大小必须相等。
*注意,如果你的函数y=func(x) 返回的y不是一个标量值,而是矩阵,字符串,cell数组等不单单占一个存储空间的数据时
要设置cellfun的输出形式UniformOutput为0
b=cellfun(\’func\’,a,\’UniformOutput\’,0);
这时候b也是一个cell矩阵了,每个元素是根据a中计算的结果
例1、Fun调用B中的一个数值
>> s=[1 2;3 4]; >> f=@(x) x^2; >> arrayfun(f,s) ans = 1 4 9 16
例2、Fun的接受参数是一个向量
>> ss=num2cell(s,2); >> f=@(x) sum(x{:}.^2); >> arrayfun(f,ss) ans = 5 25
例3、Fun函数返回值是向量
>> F=@(x) x{:}.^2; >> cell2mat(arrayfun(F,ss,\'UniformOutput\',false)) ans = 1 4 9 16
例4、Fun函数参数不唯一
>> f=@(x,y) x^2+y^2; >> [X,Y]=meshgrid(-2:2,-1:5); >> Z=arrayfun(f,X,Y); >> mesh(X,Y,Z)
例5、Fun函数的参数不唯一,而且都是向量
>> F=@(f,h)sum(diff(f{:}).^2)+sum(diff(h{:}).^2); >> f=[1,2,3;3,4,5;1,2,5]; >> h=[2,4;4,5;]; >> ff=num2cell(f,2); >> hh=num2cell(h,2); >> fff=repmat(ff\',length(hh),1); >> hhh=repmat(hh,1,length(ff)); >> arrayfun(F,fff,hhh) ans = 6 6 14 3 3 11
10. fix 向0靠拢取整
11. clf 清除图形
12. imcrop 图像裁剪
调用格式:
I2=imcrop(I,RECT);
X2=imcrop(X,MAP,RECT);
RGB2=imcrop(RGB,RECT);
其中,I、X、RGB分别对应灰度图像、索引图像、RGB图像的数据矩阵,MAP为索引图像颜色表,I2、X2、RGB2分别为各自输入矩阵所对应的输出矩阵。而RECT为可选参数,格式为[XMIN YMIN WIGTH HEIGHT].例如[20 20 40 40],则剪裁后的图像的左上角像素为原图像位置在(20,20)的像素,而剪裁后图像的右下角像素为原图像位置在(60,60)的像素。
另外,如不加参数RECT,将使用鼠标在原图像上划矩形框的方法来实现图像的剪裁,所划矩形框内的图像将在新窗口中输出。
13. cumsum 计算各行的累加值
14. drawnow
将还未处理完的图像实时的显示出来,可以理解为立即执行的plot,变化的plot。
当代码执行时间长,需要反复执行plot时,Matlab程序不会马上把图像画到figure上,这时,要想实时看到图像的每一步变化情况,需要使用这个语句。
15.sub2ind:把数组中元素下标转换为该元素在数组中对应的索引值
在命令窗口输入:
>> A=[4 7 2 9 8;3 9 1 4 3;1 5 9 6 4;8 3 7 1 0]
A =
4 7 2 9 8
3 9 1 4 3
1 5 9 6 4
8 3 7 1 0
则A中每个元素对应的索引如下(MATLAB中数据是按列的方式存储的):
1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20
ind=sub2ind(siz,I,J):siz表示要转换的矩阵的行列数,I是要转换矩阵的行标,J是要转换矩阵的列标。I,J的行列数必须相同。ind为输出参数,其行列数与I,J相同。ind即为索引。
在命令窗口中输入:
>> ind=sub2ind(size(A),[1,2;3,4],[1,1;2,2])
则显示
ind =
1 2
7 8
从运算结果可以看出,在矩阵A中,下标(1,1)的索引值为1,下标(2,1)的索引值为2,下标(3,2)的索引值为7,下标(4,2)的索引值为8
16.numel
该函数用于计算数组中满足指定条件的元素个数。若是一幅图像,则numel(A)将给出它的像素数。语法格式: n = numel(A) 返回数组A中元素个数。
17.unique
b = unique (a) %取集合a的不重复元素构成的向量
18. nnz(A)返回A中非0元素的个数