根据《一种改进的zernike正交矩亚像素边缘检测算法》所写的matlab程序

根据《一种改进的zernike正交矩亚像素边缘检测算法》所写的matlab程序,第1张

文本文件的读写 *** 作

1)读文本文件fscanf函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为:

[A,COUNT]=fscanf(fid,format,size)

说明:其中A用来存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,format用来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。

2)写文本文件

fprintf函数可以将数据按指定格式写入到文本文件中。其调用格式为:

fprintf(fid,format,A)

说明:fid为文件句柄,指定要写入数据的文件,format是用来控制所写数据格式的格式符,与fscanf函数相同,A是用来存放数据的矩阵。

例6.9 创建一个字符矩阵并存入磁盘,再读出赋值给另一个矩阵。

% [A_nm,zmlist,cidx,V_nm]= zernike(img,n,m) 计算Zernike矩

% V_nm

为n阶的Zernike多项式,定义为在极坐标系中p,theta的函数

% cidx 表示虚部值

% A_nm

为zernike矩

function[A_nm,zmlist,cidx,V_nm]=

zernike(img,n,m)

if nargin>0

if nargin==1

n=0

end

d=size(img)

img=double(img)

xstep=2/(d(1)-1)%

取步长

ystep=2/(d(2)-1)

[x,y]=meshgrid(-1:xstep:1,-1:ystep:1)%

画方格

circle1= x.^2 + y.^2

inside=find(circle1<=1)%

提取符合circle1<=1的数

mask=zeros(d)%

构造size(d)*size(d)的矩阵。

mask(inside)=ones(size(inside))%

构造size(inside)*size(inside)的全为1的矩阵赋值给mask(inside)

[cimg,cidx]=clipimg(img,mask)

% 计算图像的复数表示

int i

z=clipimg(x+i*y,mask)% 计算Z的实部和虚部

p=0.9*abs(z) %

计算复数的模,sqrt(x,y),z=x+iy

theta=angle(z)% 计算复数z的辐角值(tanz)

c=1

for

order=1:length(n)

n1=n(order)

% if input arguments less than

3

if nargin<3

m=zpossible(n1)

end

for r=1:length(m)

V_nmt=zpoly(n1,m(r),p,theta)% V_nm为n阶的Zernike多项式,定义为在极坐标系中p,theta的函数

zprod=cimg.*conj(V_nmt)% conj是求复数的共轭

A_nm(c)=(n1+1)*sum(sum(zprod))/pi% (n1+1)/π*∑∑(zprod)对于图像而言求和代替了求积分

zmlist(c,1:2)=[n1 m(r)]

if nargout==4

V_nm(:,c)=V_nmt

end

c=c+1

end

end

else

end

% 计算复数的实部和虚部

function

[cimg,cindex,dim]=clipimg(img,mask)

dim=size(img)

cindex=find(mask~=0)

cimg=img(cindex)

return

%

判断n是偶数还是奇数,是偶数时,m取0,2,4,6等,否则取奇数赋值m

function [m]=zpossible(n)

if

iseven(n)

m=0:2:n

else

m=1:2:n

end

return

%

计算Zernike矩多项式

function

[V_nm,mag,phase]=zpoly(n,m,p,theta)

R_nm=zeros(size(p))%

产生size(p)*size(p)的零矩阵赋给R_nm

a=(n+abs(m))/2

b=(n-abs(m))/2

total=b

for

s=0:total

num=((-1)^s)*fac(n-s)*(p.^(n-2*s))%

(-1).-1*(n-s)!r.^(n-2*s)

den=fac(s)*fac(a-s)*fac(b-s)%

s!*(a-s)!*(b-s)!

R_nm=R_nm + num/den%

R_nm是一个实数值的径向多项式

end

mag=R_nm%

赋值

phase=m*theta

V_nm=mag.*exp(i*phase)%

V_nm为n阶的Zernike多项式,定义为在极坐标系中p,theta的函数

return

% 求n的阶乘

function

[factorial]=fac(n)

maxno=max(max(n))

zerosi=find(n<=0)

%取n小于等于0的数

n(zerosi)=ones(size(zerosi))

factorial=n

findex=n

for

i=maxno:-1:2

cand=find(findex>2)

candidates=findex(cand)

findex(cand)=candidates-1

factorial(cand)=factorial(cand).*findex(cand)

end

return

function

[verdict]=iseven(candy)

verdict=zeros(size(candy))

isint=find(isint(candy)==1)

divided2=candy(isint)/2

evens=(divided2==floor(divided2))

verdict(isint)=evens

return

function

[verdict]=isint(candy)

verdict=

double(round(candy))==candy

return


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12151134.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存