您的位置:首页 > 编程语言 > MATLAB

MATLAB使用频率方法的运动检测

2015-12-15 21:57 351 查看
上一篇文章是坑,愿你没被我带入。不说了。
强烈推荐论文Phase Correlation Based Image Alignment with Subpixel Accuracy(http://link.springer.com/chapter/10.1007/978-3-642-37807-2_15
因为我只要检测刚体位移,所以关于缩放和旋转的部分都略过。
这个方法的原理是,在图像的傅里叶变换域,平移相当于相位差(大致上,旋转相当于幅值的旋转,缩放相当于缩放,更严谨请读An FFT-Based Technique for Translation, Rotation, and Scale-Invariant Image Registration(http://wenku.baidu.com/view/bd0e9dd184254b35eefd3404.html),错了请不要找我)。
 
心理准备:傅里叶变换域是复数域。
 
实现步骤:
1、读视频下一帧,连同参考帧一起,进行:
2、转换为灰度图
3、二值化(如果图像噪音较小,可以省略这步,一般加上也没坏处)
4、傅里叶变换
4_2、应用窗函数
这是为了避免高频噪音对计算结果的影响。窗函数也许并不是做这个用的。具体而言,就是将二维窗函数与傅里叶变换结果进行一一相乘。
5、与参考帧傅里叶变换计算相位差:
相位差 = 当前帧傅里叶变换G ./ 参考帧傅里叶变换F
如果感光度(或环境亮度)有所变化,可以使用下式:
相位差 = F .* G` ./ | F .* G` |
F,G含义见上一式,G`表示G的共轭复数
6、对相位差进行反傅里叶变换
7、反过来之后,应用FFTSHIFT函数将中心点移到边缘。
其实我也不知道我在做什么,反正不这样做的话得不到负的位移。
8、找到最大值点的坐标
9、减去中心点的坐标,得出相对位移,成功!
10、重复步骤1
 
就是不断进行两张图像的比较。参考图像可以选第一帧,也可以选上一帧。选第一帧的话,运动距离大了以后误差会增大,但能避免累积误差,就看应用需要了。
 
一些MATLAB函数:
RGB图转换为灰度图:rgb2gray
自动计算二值化阈值:graythresh
二维窗函数:http://www.mathworks.com/matlabcentral/fileexchange/43827-two-dimensional-window-generator--2d-window-
(我用了hamming窗)
二维快速傅里叶变换:fft2
二维快速反傅里叶变换:ifft2
“移到边缘”:fftshift
找最大值:max
 
这次大概不是坑,我检查了计算结果还算靠谱。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: