matlab/STMAD_2011_MatlabCode/calcSTMADScore.m (73 lines of code) (raw):
function calcSTMADScore(OrgFile,DstFile,Wid,Hei)
OrgYuv = yuvread(OrgFile, Wid, Hei, '420');
DstYuv = yuvread(DstFile, Wid, Hei, '420');
len = length(DstYuv);
% Compute Spatial MAD
HiIndex = zeros(len, 1);
LoIndex = zeros(len, 1);
for idx = 1:len
OrgImg = double(OrgYuv(idx).cdata(:,:,1));
DstImg = double(DstYuv(idx).cdata(:,:,1));
HiIndex(idx) = hi_index(OrgImg, DstImg);
LoIndex(idx) = lo_index(OrgImg, DstImg);
end
MadHi = mean(HiIndex);
MadLo = mean(LoIndex);
b1 = exp(-2.55/3.35);
b2 = 1/(log(10)*3.35);
alpha = 3/7;
sig = 1 ./ ( 1 + b1*(MadHi).^b2 ) ;
MadVals.SMAD = MadHi.^(sig/4) + MadLo.^(1-sig);
% Compute Motion Weights using optical flow method
M = MotionWeight(OrgYuv, Wid, Hei);
tmpCol = M.wCol;
mCol = sum(tmpCol);
if mCol == 0,
mCol = 1;
tmpCol = 1/length(tmpCol)* ones(size(tempCol));
end
tmpRow = M.wRow;
mRow = sum(tmpRow);
if mRow == 0,
mRow = 1;
tmpRow = 1/length(tmpRow)* ones(size(tempRow));
end
% Compute Temporal MAD for 1 of every 8 STS images
nrows = floor(Hei/8);
ncols = floor(Wid/8);
mad_rows = zeros(nrows,1);
mad_cols = zeros(ncols,1);
% Extract STS column images and compute d_appear index
Org_STS_Col = zeros(Hei,len);
Dst_STS_Col = zeros(Hei,len);
for t1=1:ncols
colid = 8*t1-3;
for idx = 1:len
Org_STS_Col(:,idx) = uint8(OrgYuv(idx).cdata(:,colid,1));
Dst_STS_Col(:,idx) = uint8(DstYuv(idx).cdata(:,colid,1));
end
mad_cols(t1) = lo_index(Org_STS_Col, Dst_STS_Col);
end
% Extract STS row images and compute d_appear index
Org_STS_Row = zeros(len, Wid);
Dst_STS_Row = zeros(len, Wid);
for t2=1:nrows
rowid = 8*t2-3;
for idx = 1:len
Org_STS_Row(idx,:) = uint8(OrgYuv(idx).cdata(rowid,:,1));
Dst_STS_Row(idx,:) = uint8(DstYuv(idx).cdata(rowid,:,1));
end
mad_rows(t2) = lo_index(Org_STS_Row, Dst_STS_Row);
end
stsCol = log10(1000*alpha + mCol) * sum(tmpCol.*mad_cols)/mCol;
stsRow = log10(1000*alpha + mRow) * sum(tmpRow.*mad_rows)/mRow;
MadVals.TMAD = stsRow^alpha + stsCol^(1-alpha);
% Compute ST-MAD index
movIndex = mRow / (mRow + mCol);
beta = log10(1+movIndex);
MadVals.STMAD = 2.5 * log10(beta.*MadVals.SMAD) + MadVals.TMAD;
for iframe = 0 : len-1
disp(sprintf('smad: %d %f', iframe, MadVals.SMAD));
disp(sprintf('tmad: %d %f', iframe, MadVals.TMAD));
disp(sprintf('stmad: %d %f', iframe, MadVals.STMAD));
end;