从今天开始准备干一项工程,陆续介绍hevc标准中的算法和部分代码。hevc的参考代码是HM,目前最新的版本是HM10.0,首先来说下HM如何配置及运行的结果。
配置的方法:
1. 编码端: 输入参数包含在cfg目录下的cfg文件中,只需输入cfg文件即可, 输入形式为-c 1.cfg -c 2.cfg,如果想调整某些参数的值,一种方法是直接修改其cfg里面的值,一种是输入参数的时候修改参数的值,如--QP=22,这里的设置就是将量化参数设置为22,如果想设置其他参数,可以直接运行TAppEncoder.exe来进行参数名称及输入格式的获取
2. 解码端的类似:解码端的主要任务就是通过解码编码端生成的码流来重建图像。最简单的配置方法是 -bstr.bin(str.bin为编码端生成的码流文件),如果想输出重建图像,可以加上-otest.yuv, 这样重建图像就会被输出到test.yuv文件中。
运行的结果:(略过所有的参数)
这里面有两个衡量性能的重要的参数:
Bitrate: 码率,描述每秒传输多少bits,HM中用的单位是kbps,即每秒传输多少千个bits,计算公式为 bitrate = FrameBits*FrameRate/(FrameNumber*1000)
PSNR:http://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio,可以从wiki上了解其定义
如果想根据这两个参数来比较算法的优劣,有良总方法,一种是可以根据[1]中的计算方式来算BD-bitrate和BD-psnr,另一种是用matlab和excel画散点图来进行比较,如图[2]所示,最后附上Matlab的代码
[1] G.Bjontegaard,“Calculation of Average PSNR Differences betweenRD-curves,” VCEG-M33, 13thmeeting: Austin, Texas, USA, April 2001
图[2]:
Matlab代码
%function [ output_args ] = Untitled1(file_name )
%画出RD曲线
data = load('nonpri.txt');
% odd = [1 2 3 4 5];
% even = [6 7 8 9 10];
% propose = [ 1:9];
% jpeg = [10:18];
propose1 = [1:4];
propose2 = [5:8];
propose4 = [9:12];
propose8 = [13:16];
propose16 = [17:20];
propose32 = [21:24];
%BCIM = [ 5:8];
figure;
plot(data(propose1,1),data(propose1,2),'-sc');
hold on;
plot(data(propose2,1),data(propose2,2),'-sm');
hold on;
plot(data(propose4,1),data(propose4,2),'-sg');
hold on;
plot(data(propose8,1),data(propose8,2),'-sk');
hold on;
plot(data(propose16,1),data(propose16,2),'-sb');
hold on;
plot(data(propose32,1),data(propose32,2),'-sr');
%grid on;
set(gca,'YGrid','on');
% title('Stefan, QCIF, 300 Frames, All Intra Frames');
%title('Lena512');
% title('Mobile, CIF, 300 Frames, All Intra Frames');
% xlabel('Bitrate[Kbit/s]');
%____ xlabel('Coding bits for Lena[bpp]');
%____ ylabel('PSNR[dB]');
xlabel('Bit-rate(Kbps)');
ylabel('PSNR(db)');
legend(' 1 color',' 2 colors',' 4 colors',' 8 colors',' 16 colors',' 32 colors',4);
% legend('JM10.1','Proposed',4);
% legend('JPEG2000','Proposed', 4);