📄 ebma_vectorcode.m
字号:
%子函数的功能:进行运动矢量的矢量量化编码,返回的是解码后的运动场
function vecode_m_field=ebma_vectorcode(motionfield)
%图像块的xy运动分量
x1=motionfield(:,:,1);
x2=motionfield(:,:,2);
[wdnum hgnum]=size(x1);
N=128;%码书大小
%码书
for i=1:wdnum
for j=1:hgnum
if (j-1)*wdnum+i<=N
codebox((j-1)*wdnum+i,1:2)=double(motionfield(i,j,1:2));
end
end
end
%每个块属于哪个码字
codenum=zeros(wdnum,hgnum);
%属于每个码字的块的数目
total=zeros(N,1);
%修改码字的累计值
total_pel=zeros(N,2);
%编码程序,得到最终的码书
T=0;
pre=0;
past=0;
while (T==0&pre==0&past==0)|(T>0&abs(past-pre)>pre*0.01)
T=T+1;
pre=past;
past=0;
for i=1:wdnum
for j=1:hgnum
element1=double(x1(i,j));
element2=double(x2(i,j));
result=Inf;
for m=1:N
codemember1=codebox(m,1);
codemember2=codebox(m,2);
if result>sqrt((element1-codemember1)^2+(element2-codemember2)^2)
result=sqrt((element1-codemember1)^2+(element2-codemember2)^2);
codenum(i,j)=m;
end
end
past=past+result;
end
end
for i=1:wdnum
for j=1:hgnum
element1=double(x1(i,j));
element2=double(x2(i,j));
num=codenum(i,j);
total(num,1)=total(num,1)+1;
total_pel(num,1)=total_pel(num,1)+element1;
total_pel(num,2)=total_pel(num,2)+element2;
end
end
for i=1:N
if total(i,1)~=0
codebox(i,1:2)=total_pel(i,1:2)/total(i,1);
end
end
end
%解码过程
%运动场解码后的数据decode(1:wdnum,1:hgnum,1:2)
for i=1:wdnum
for j=1:hgnum
num=codenum(i,j);
decode(i,j,1:2)=codebox(num,1:2);
end
end
decode=uint8(decode);
decode=double(decode);
vecode_m_field=decode;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -