一种基于FSIM对视频编码图像质量客观评价的方法
一 为什么对视频编码图像质量客观评价
视频图像质量主观评价一般采用连续双激励质量度量法对任一观测者连续给出原始视频图像和处理过的失真图像,由观测者根据主观感知给出分值,其需针对多个视频对象进行多次重复实验,耗时多、费用高,难以操作;而视频编码图像的客观评价早期主要采用峰值信噪比(PSNR)或均方差(MSE)衡量视频序列的失真度,虽然其具有操作简单、成本低、易于实现的特点,但是由于其忽略了图像内容对人眼的影响,不能完整地反映出图像的质量。所以现实中还是多以主观评价方式为主的,码率影响视频请晰度,但是这也是在两个码率比较悬殊的两个视频序列的画质才可以被人眼比较明显感知到,否则很难定定量衡量码率提升带来的视频画质的提升效益。如何让视频图像质量客观评价方法产生的结果逼近主观评价结果进而定量衡量视频图像质量,为此近些年出现了多种基于结构化、人眼生理特征建立的视觉感知模型与统计算法的客观评价方法。
二 都有哪些视频编码图像质量客观评价(限于有全参考图像即FR)的方法
- PSNR
- NQM
- UQI
- SSIM
- MS-SSIM
- IFC
- VIF
- VSNR
- IW-SSIM
- RFSIM
- FSIM
三 都有哪些评估视频编码图像质量客观评价方法的优劣的方法
- SROCC
- KROCC
- PLCC
- RMSE
四 为测试视频编码图像质量客观评价方法相应算法都有哪些图像模型库
- TID2013
- TID2008
- CSIQ
- LIVE
- IVC
- MICT
- WIQ
- A57
五 以TID2013来看看哪个方法评价视频图像质量最牛

备注:* Spearman correlation即SROCC
* Kendall correlation即KROCC
* FSIMc是同时计算色度的FSIM
* 由此可以看出在这些评价算法中最接近主观评价分值的是FSIM,所以下面我们以该方法定量衡量不同编码参数对编码出的图像质量的影响。
六 如何使用FSIM
官网地扯:http://www4.comp.polyu.edu.hk/~cslzhang/IQA/FSIM/FSIM.htm,算法以matlab语言实现,所以使用前要先装matlab,然后在matlab命令窗口先用imread加载一个参考图像与一个相应的扭曲图像,然后调用FeatureSIM进行特值相似度值的计算,值越高说明后者图像质量越高。使用方法示例如下:

七 封装FSIM便于批量处理
- 枚举某一目录下所有图像文件函数
function [Status, FileList] = EnumPRefDir( RefDir )
%EnumPRefDir 枚举某一保存参考图片的目录获取其中的所有参考图像文件
% 枚举目录(排除子目录包括.或..)
% 输入参数
% refdir 被枚举的目录
% 输出参数
% Status 为0表示文件列表为空,1非空
% FileList 文件列表
% 调用示例
% [Status, FileList] = EnumPRefDir( 'RefDir' ); %FileList{1} = 'a111.txt';
%FileList{2} = 'a112.txt'; if ~exist(RefDir, 'dir')
strerr = ['目录', RefDir, '不存在'];
disp(strerr);
end DirList=dir(RefDir);
FileListIndex = 1;
Status=0;
FileList{FileListIndex}=char('empty');
for DirListIndex=1:length(DirList)
if ~DirList(DirListIndex).isdir
FileList{FileListIndex} = char(DirList(DirListIndex).name);
FileListIndex = FileListIndex + 1;
Status=1;
end
end end - 调用FSIM计算两个文件夹中的图片从而生成相似度列表文件
function Status = FSIMBetweenTwoFileFolder( RefDir, DecodeDir )
%FSIMBetweenTwoFileFolder 调用FSIM计算两个文件夹中的图片从而生成相似度列表文件
% 基于参考与解码文件夹计算这些文件夹中相应图片的相似度
% Tip:两个文件夹中的文件命名方式相同,比如RefDir/P000001与RefDir/P000001
% 输入参数
% RefDir 参数图片文件夹
% DecodeDir 解码图片文件夹
% 输出参数
% Status 为0出现错误(比如文件夹为空或两个文件夹图片命方式不同或数量不同)
% 为1全部文件都经过了正确的相似度计算
% 输出相似度列表文件
% RefDir+DecodeDir+'FSIM.txt',其行格式为:图片文件名 + ' ' + 相似度值 + ' ' + 相似度值c
% 调用示例
% Status = FSIMBetweenTwoFileFolder('RefDir', 'DecodeDir1'); Status = 1;
if ~exist(RefDir, 'dir') || ~exist(DecodeDir, 'dir')
strerr = ['目录', RefDir,'或',DecodeDir, '不存在'];
disp(strerr);
Status = 0;
return;
end SListFileName = strcat(RefDir, '_');
SListFileName = strcat(SListFileName, DecodeDir);
SListFileName = strcat(SListFileName, '_FSIM.txt'); try
[FStatus, FileList] = EnumPRefDir( RefDir ); if(FStatus == 0)
Status = 0;
return;
end SListFileID = fopen(SListFileName, 'w');
if(SListFileID < 0)
Status = 0;
return;
end for FIndex = 1 : length(FileList)
OneRefFileName =['', RefDir, '/', char(FileList(FIndex))];
OneDecodeFileName = ['', DecodeDir, '/', char(FileList(FIndex))]; if ~exist(OneRefFileName, 'file') || ~exist(OneDecodeFileName, 'file')
Status = 0;
break;
else
try
OneRefFileHandle = imread(OneRefFileName);
OneDecodeFileHandle = imread(OneDecodeFileName);
[FSIM, FSIMc] = FeatureSIM(OneRefFileHandle, OneDecodeFileHandle);
fprintf(SListFileID, '%s %f %f\r\n', char(FileList(FIndex)), FSIM, FSIMc);
catch rme
disp(rme.message);
Status = 0;
break;
end
end
end fclose(SListFileID);
catch eme
disp(eme.message);
Status = 0;
end
if ~Status
delete(SListFileName);
end
end - 驱动函数
function FSIMDriver( RefDir,DecodeDir1, DecodeDir2 )
%FSIMDriver FSIM相似度计算主驱动程序
% FSIM相似度计算主驱动程序
% 说明
% 跟据目前的需求,主要基于编码前图像目录(RefDir)与两种不同编码参数相应的
% 两类解码图像目录(DecodeDir1与DecodeDir2)计算图像特征相似度,从而比较不同的编码参数的效果
% 输入参数
% RefDir 保存编码前图像文件的文件夹名称,默认值是当前目录下的‘RefDir’
% DecodeDir1 保存解码后图像文件的文件夹名称,默认值是当前目录下的‘DecodeDir1’
% DecodeDir2 保存解码后图像文件的文件夹名称(DecodeDir1与DecodeDir2中的图像文件编码参数不同),默认值是当前目录下的‘DecodeDir2’ % 输出参数
% 无
% 调用示例
% FSIMDriver(); narginchk(0, 3);
nargoutchk(0, 0); if nargin < 3
DecodeDir2='DecodeDir2';
end if nargin < 2
DecodeDir1='DecodeDir1';
end if nargin < 1
RefDir='RefDir';
end try
ErrorCode = FSIMBetweenTwoFileFolder(RefDir, DecodeDir1);
disp(['基于目录',RefDir,'与', DecodeDir1, '计算图像特征相似度', GetErrorDisp( ErrorCode )]); ErrorCode = FSIMBetweenTwoFileFolder(RefDir, DecodeDir2);
disp(['基于目录',RefDir,'与', DecodeDir2, '计算图像特征相似度', GetErrorDisp( ErrorCode )]);
catch tme
disp(tme.message);
end
end function ErrorDisp = GetErrorDisp( ErrorCode )
if ErrorCode
ErrorDisp = '成功';
else
ErrorDisp = '失败';
end
end - 生成可执行文件
在matlab命令窗口输入以下命令,这样就可以在当前目录下的子目录target生成了FSIMDriver.exe:
mkdir target
mcc -m -d target FSIMDriver - 在没有安装matlab的用户机如何运行FSIMDriver,首先在matlab命令窗口调用mcrinstaller显示如下找到mcrinstaller.exe的位置,在用户机通过该程序安装matlab运行时,然后在window命令行窗口即可运行FSIMDriver.exe。

- FSIMDriver.exe需要三个命令行参数,分别为保存编码前图像文件的目录名称、两个保存解码后的图像文件的目录(这两个目录中的图像文件是由不同编码参数所编码视频序列解码后的图像文件且这两个目录中的文件名称与编码前保存的图像文件的名称一样)。
八 总结
由于视频图像序列场景不停在变化,所有图像质量评价方法包括FSIM在定量衡量编码之后的图像失真度还是存在一定局限性,不过作为一个方向还是值得关注的。
一种基于FSIM对视频编码图像质量客观评价的方法的更多相关文章
- MPEG-4视频编码核心思想
1 引言 当今时代,信息技术和计算机互联网飞速发展,在此背景下,多媒体信息已成为人类获取信息的最主要载体,同时也成为电子信息领域技术开发和研究的热点.多媒体信息经数字化处理后具有易于加密.抗干扰能 ...
- 基于Linux应用层的6LOWPAN物联网网关及实现方法
本发明涉及一种基于Linux应用层的6LOWPAN物联网网关及实现方法,所述物联网网关包括开发平台以及无线射频模块,其实现方法是:所述6LOWPAN物联网网关的以太网网口收到访问6LOWPAN无线传感 ...
- 【转载】视频编码(H264概述)
一视频编码介绍 1.1 视频压缩编码的目标 1)保证压缩比例 2)保证恢复的质量 3)易实现,低成本,可靠性 1.2 压缩的出发点(可行性) 1)时间相关性 在一组视频序列中,相邻相邻两帧只有极少的不 ...
- 【图像处理】DVR H.264视频编码基本知识
视频编码技术基本是由ISO/IEC制定的MPEG-x和ITU-T制定的H.26x两大系列视频编码国际标准的推出.从H.261视频编码建议,到 H.262/3.MPEG-1/2/4等都有一个共同的不断追 ...
- 直播平台搭建之音视频开发:认识主流视频编码技术H.264
H.264简介 什么是H.264?H.264是一种高性能的视频编解码技术.目前国际上制定视频编解码技术的组织有两个,一个是"国际电联",它制定的标准有H.261.H.263.H.2 ...
- 【转】基于DM8168的视频智能分析系统的设计方案
[导读] 为了实现高清视频的智能分析功能,本文介绍了一种以TI公司的DM8168为核心的高清视频智能分析系统的设计方案,该方案从硬件设计和软件设计两个方面介绍了硬件组成.工作流程.软件架构,并 ...
- 基于Linux的视频传输系统(上大学时參加的一个大赛的论文)
文件夹 1原创性声明----------------------------------------------------3 2 摘要-------------------------------- ...
- Android实现录屏直播(三)MediaProjection + VirtualDisplay + librtmp + MediaCodec实现视频编码并推流到rtmp服务器
请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接:http://blog.csdn.net/zxccxzzxz/article/details/55230272 Android实现录 ...
- 嵌入式 视频编码(H264)
这几天在编写视频录制模块,所以,闲暇之余,又粗粗的整理了一下,主要是API,以备不时之用 摄像头获取的模拟信号通过经芯片处理(我们使用的是CX25825),将模拟信号转成数字信号,产生标准的IT ...
随机推荐
- AOP in Spring
AOP in Spring 是不是已经对包裹在每个业务周围的异常处理.事务管理.性能监控.日志记录等重复出现的代码感到厌倦,那么是时候轮到AOP出场了.不得不承认程序员的惰性有时候会是一件好事(毕竟提 ...
- Introduction to SharePoint hierarchy
/* Author: Jiangong SUN */ I've participated in a SharePoint 2010 project to build an intranet. Base ...
- 【Win32API】SendInput ERROR_BUSY 错误原因
最近需要解决一个Windows上模拟键盘输入的问题, 使用SendInput这个API来实现的.当我从另外一台机器给当前机器发送一条键盘指令时,发现SendInput一直是成功的,但是没有看到任何输入 ...
- STL---基本算法---<stl_algobase.h>概述
通过一个实例来说明这些算法的接口使用: #include <iostream> #include <algorithm> #include <functional> ...
- Eclipse 4.3正式版发布
Eclipse 4.3正式版发布 作者:chszs,转载需注明.博客主页: http://blog.csdn.net/chszs Eclipse 4.3版代号为Kepler. 主要特性如下: 1. E ...
- javascript深入之location对象和history对象
浏览器的location 和history对象: 一.location对象: 1>location.reload() 相当于按浏览器上的“刷新”(IE)或“Reload”(Netscape)键. ...
- 命令版本git 分支篇-----不断更新中
最近应用开发的过程中出现了一个小问题,顺便记录一下原因和方法--命令版本 开发中想看看过去某个版本的代码,我们先查看log git log commit f224a720b8192165a4e70f2 ...
- Dubbo源码学习--服务是如何引用的
ReferenceBean 跟服务引用一样,Dubbo的reference配置会被转成ReferenceBean类,ReferenceBean实现了InitializingBean接口,直接看afte ...
- [ios] 微信订阅号: ios博文精选
晚上下班后时间充裕,平时要么看电视剧,要么玩游戏 感觉浪费时间. 最后决定自己也搞一个微信订阅号分享技术方面的东西,也提升自己. 如果大家也是一样情况,欢迎大家关注我的订阅号. 微信订阅号: ios ...
- 用C++实现的八皇后问题
我是一个C++初学者,控制台实现了一个八皇后问题. 代码如下: //"八皇后问题"V1.0 //李国良于2017年1月11日编写完成 #include <iostream&g ...