Code covered by the BSD License  

Highlights from
Bjontegaard metric calculation (BD-PSNR)

Bjontegaard metric calculation (BD-PSNR)

by

 

Bjontegaard metric allows to compute the average distance between two RD-curves

bjontegaard2(R1,PSNR1,R2,PSNR2,mode)
function avg_diff = bjontegaard2(R1,PSNR1,R2,PSNR2,mode)

%bjontegaard2    Bjontegaard metric calculation
%   Bjontegaard's metric allows to compute the average gain in PSNR or the
%   average per cent saving in bitrate between two rate-distortion
%   curves [1]. 
%   Differently from the avsnr software package or VCEG Excel [2] plugin this
%   tool enables Bjontegaard's metric computation also with more than 4 RD
%   points.
%   Fixed integration interval in version 2.
%
%   R1,PSNR1 - RD points for curve 1
%   R2,PSNR2 - RD points for curve 2
%   mode - 
%       'dsnr' - average PSNR difference
%       'rate' - percentage of bitrate saving between data set 1 and
%                data set 2
%
%   avg_diff - the calculated Bjontegaard metric ('dsnr' or 'rate')
%   
%   (c) 2010 Giuseppe Valenzise
%
%% Bugfix 20130515
%   Original script contained error in calculation of integration interval.
%   It was fixed according to description and figure 3 in original
%   publication [1]. Script was verifyed using data presented in [3].
%   Fixed lines labeled as "(fixed 20130515)"
%
%   (c) 2013 Serge Matyunin 
%%
%
%   References:
%
%   [1] G. Bjontegaard, Calculation of average PSNR differences between
%       RD-curves (VCEG-M33)
%   [2] S. Pateux, J. Jung, An excel add-in for computing Bjontegaard metric and
%       its evolution
%   [3] VCEG-M34. http://wftp3.itu.int/av-arch/video-site/0104_Aus/VCEG-M34.xls
%
% convert rates in logarithmic units
lR1 = log(R1);
lR2 = log(R2);

switch lower(mode)
    case 'dsnr'
        % PSNR method
        p1 = polyfit(lR1,PSNR1,3);
        p2 = polyfit(lR2,PSNR2,3);

        % integration interval (fixed 20130515)
        min_int = max([ min(lR1); min(lR2) ]);
        max_int = min([ max(lR1); max(lR2) ]);
        

        % find integral
        p_int1 = polyint(p1);
        p_int2 = polyint(p2);

        int1 = polyval(p_int1, max_int) - polyval(p_int1, min_int);
        int2 = polyval(p_int2, max_int) - polyval(p_int2, min_int);

        % find avg diff
        avg_diff = (int2-int1)/(max_int-min_int);

    case 'rate'
        % rate method
        p1 = polyfit(PSNR1,lR1,3);
        p2 = polyfit(PSNR2,lR2,3);

        % integration interval (fixed 20130515)
        min_int = max([ min(PSNR1); min(PSNR2) ]);
        max_int = min([ max(PSNR1); max(PSNR2) ]);

        % find integral
        p_int1 = polyint(p1);
        p_int2 = polyint(p2);

        int1 = polyval(p_int1, max_int) - polyval(p_int1, min_int);
        int2 = polyval(p_int2, max_int) - polyval(p_int2, min_int);

        % find avg diff
        avg_exp_diff = (int2-int1)/(max_int-min_int);
        avg_diff = (exp(avg_exp_diff)-1)*100;
end

Contact us