作业帮 > 综合 > 作业

有一个matlab的函数文件,但是不知道每一步的意思,

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/06/05 02:28:38
有一个matlab的函数文件,但是不知道每一步的意思,
函数文件内容如下:
function [corr] = corrfft(f,g)
%计算相关系数,其中f和g为两幅图像,本函数的作用是计算f和g的相关系数
sze = size(f);
sze = sze(1);
f = flipud(fliplr(f));
ffft = fft2(f,sze*2,sze*2);
gfft = fft2(g,sze*2,sze*2);
yout = ifft2(ffft.*gfft);%逆变换
startpt = sze/2 + 1;
endpt = sze*2 - sze/2;
h = yout(startpt,:);
for i = (startpt+1):endpt
h = [h; yout(i,:)];
end
yout = h(:,startpt);
for i = (startpt+1):endpt
yout = [yout h(:,i)];
end
y = yout;
corr = max(max(y));
这个函数是计算两幅图像相关系数的,但是具体怎么实现的我看不懂,谁能帮忙注释一下每句的意思,感激不尽啊
有一个matlab的函数文件,但是不知道每一步的意思,
function [corr] = corrfft(f, g)
%计算相关系数,其中f和g为两幅图像,本函数的作用是计算f和g的相关系数
sze = size(f);%%得到图像f的尺寸,sze共2个元素,一个是行数,一个是列数
sze = sze(1);%%sze为图像f的行数
f = flipud(fliplr(f));%%相当于对图像进行逆时针180°旋转
ffft = fft2(f, sze*2, sze*2);
gfft = fft2(g, sze*2, sze*2);%%对图像进行二维傅里叶变换,(sze*2)*(sze*2)控制图像大小,如果图像f和g的大小小于(sze*2)*(sze*2)的话就给其补0,让其尺寸增大为(sze*2)*(sze*2),最终返回结果的尺寸也是(sze*2)*(sze*2)
根据计算相关系数的公式,可以看出是进行二维卷积,所以转换到频率域就是直接相乘
yout = ifft2(ffft.*gfft);%逆变换,yout就是图像ffft和图像gfft的相关系数函数,由于返回图像的尺寸是(sze*2)*(sze*2)
假设sze=256
startpt = sze/2 + 1;%%应该从129开始,即sze/2 + 1
endpt = sze*2 - sze/2+1;%%到384
h = yout(startpt,:);%%令h=yout中的129行
for i = (startpt+1):endpt
h = [h; yout(i,:)];%%把其余的130-384行全部赋给h
end%%上面主要是处理行,下面就是处理列
yout = h(:,startpt);%%把h的第129列赋给yout
for i = (startpt+1):endpt
yout = [yout h(:,i)];%%其余的130-384列赋给youty最终就是
end
y = yout;%%最终的y就是256*256大小
corr = max(max(y));%%找到相关系数函数矩阵中的最大值
再问: 非常感谢啊。相关系数越大是不是就是两幅图像越接近?还有为什么要先将图像展宽?这个算法还能不能优化一下?
再答: 1 相关系数越大,表示越接近。 2 这代码里傅里叶变换就把图像扩大了,这样傅里叶变换的点数会增多,会看到更宽频率范围内的图像特性。 3 其实没必要进行图像扩展,直接进行操作即可! ffft = fft2(f); gfft = fft2(g);%%返回的结果就是图像原来的大小 yout = ifft2(ffft.*gfft);%逆变换,yout corr = max(max(yout));%%找到相关系数函数矩阵中的最大值
再问: 不需要翻转图像吗?那一步有什么作用?
再答: 可以不旋转计算,这代码旋转图像还真看不出它有什么用!!