?? 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 + -