zoukankan      html  css  js  c++  java
  • 一种基于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便于批量处理

    1. 枚举某一目录下所有图像文件函数
      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
      
    2. 调用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
      ', 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
      
    3. 驱动函数
      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
      
    4. 生成可执行文件

      在matlab命令窗口输入以下命令,这样就可以在当前目录下的子目录target生成了FSIMDriver.exe:

      mkdir target
      mcc -m -d target FSIMDriver

    5. 在没有安装matlab的用户机如何运行FSIMDriver,首先在matlab命令窗口调用mcrinstaller显示如下找到mcrinstaller.exe的位置,在用户机通过该程序安装matlab运行时,然后在window命令行窗口即可运行FSIMDriver.exe。

    6. FSIMDriver.exe需要三个命令行参数,分别为保存编码前图像文件的目录名称、两个保存解码后的图像文件的目录(这两个目录中的图像文件是由不同编码参数所编码视频序列解码后的图像文件且这两个目录中的文件名称与编码前保存的图像文件的名称一样)。

    八 总结

        由于视频图像序列场景不停在变化,所有图像质量评价方法包括FSIM在定量衡量编码之后的图像失真度还是存在一定局限性,不过作为一个方向还是值得关注的。

  • 相关阅读:
    浅析C#中的套接字编程
    在 C# 中通过 P/Invoke 调用Win32 DLL
    读书笔记c#高级编程 委托和事件
    如何将 .net framework 打包进 msi安装包,使得安装时自动安装
    自实现input上传指定文件到服务器
    Thrift初探:简单实现C#通讯服务程序
    C# 使用NLog记录日志
    C# winform程序怎么打包成安装项目(图解)
    VUE3.0+Vant VS Code入门教程
    WCF入门教程2——创建第一个WCF程序
  • 原文地址:https://www.cnblogs.com/oldmanlv/p/5807963.html
Copyright © 2011-2022 走看看