资源简介
用分层块搜索方法HBMA得到运动矢量,比穷尽块搜索EMBA算法时间复杂度低,matlab代码
代码片段和文件信息
function [mv_x mv_yMB_searchPredict_Imgerror] = EBMA(Target_ImgAnchor_ImgBlockSizeBlockLocationRangeStartRangeEndaccuracy)
%EBMA 为穷尽块匹配算法,用来对于估计锚定帧和目标帧之间某个块的运动矢量
%此函数被 HBMA()调用.
%
%输入: Target_ImgAnchor_Img:
% 目标帧和锚定帧的图像矩阵
% BlockSize:
% 当前块的大小,BlockSize(1) * BlockSize(2)
% BlcokLocation:
% 锚定帧中块的位置
% RangeStartRangeEnd:
% 搜索区域,从 (RangeStart(1)RangeStart(2)) 到 (RangeEnd(1)RangeEnd(2))
% accuracy:
% 计算的准确度: 1 为整数像素; 2 为半像素
%输出: mv_xmv_y:
% 运动方向矢量 (mv_xmv_y)
% MB_search:
% 搜索次数
% Predict_Img:
% 对于给定块的最好预测块
% error:
% 给定块的最小绝对误差和(SAD)
%设置默认的计算准确率
if nargin < 7
accuracy = 1;
end
%初始化,赋值
MB_search = 0;
ly = BlockLocation(1);
lx = BlockLocation(2);
Ny = BlockSize(1);
Nx = BlockSize(2);
%取锚定帧中的块
AnchorBlock = Anchor_Img(ly:ly+Ny-1lx:lx+Nx-1);
%初始化位移矢量 mv_x 和 mv_y
mv_x=0;
mv_y=0;
%初始化误差(随意,足够大)
error = 255*Nx*Ny*100;
%在(RangeStart(1)RangeStart(2))到(RangeEnd(1)RangeEnd(2))范围内搜索最优估计
for y = RangeStart(1):RangeEnd(1)-accuracy*Ny+1
for x = RangeStart(2):RangeEnd(2)-accuracy*Nx+1
TargetBlock = Target_Img(y:accuracy:y+accuracy*Ny-1x:accuracy:x+accuracy*Nx-1);
%计算AnchorBlock和TargetBlock之间的误差
temp_error = sum(sum(abs(AnchorBlock-TargetBlock)));
MB_search = MB_search+1;
if temp_error < error
error = temp_error;
mv_x = x/accuracy-lx;
mv_y = y/accuracy-ly;
Predict_Img = TargetBlock;
end
end
end
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 304182 2009-05-13 20:26 HBMA\00.bmp
文件 304182 2009-05-13 20:26 HBMA\01.bmp
文件 1841 2009-05-25 20:12 HBMA\EBMA.m
文件 8073 2009-05-26 17:06 HBMA\HBMA.m
文件 3479 2009-05-15 14:12 HBMA\MEBMA.m
文件 6417 2009-05-15 14:12 HBMA\Motion_Estimation_2D.m
文件 1684 2009-05-15 14:13 HBMA\run_MEBMA.m
文件 302 2009-05-26 17:05 HBMA\run_results.m
目录 0 2009-06-17 22:42 HBMA
----------- --------- ---------- ----- ----
630160 9
评论
共有 条评论