图像质量评估BRISQUE算法详解

BRISQUE算法来源于论文:《No-Reference Image Quality Assessment in the Spatial Domain》

 BRISQUE的意思是Blind/Referenceless Image Spatial QUality Evaluator,一种无参考的空间域图像质量评估算法。算法总体原理就是从图像中提取mean subtracted contrast normalized (MSCN) coefficients,将MSCN系数拟合成asymmetric generalized Gaussian distribution(AGGD)非对称性广义高斯分布,提取拟合的高斯分布的特征,输入到支持向量机SVM中做回归,从而得到图像质量的评估结果。

MSCN系数

 MSCN系数I(x,y)定义


 其中u(x,y)为高斯滤波后的结果,σ(x,y)为标准差。MSCN系数的优点在于因为纹理等特征而产生的区域corelation很小。如下图左侧(原始像素点)和右侧(MSCN)结果间的区别。

 在图像中体现出的效果如下,右下角为MSCN系数结果:

 可以看出MSCN对于纹理的强弱并没有非常强的依赖性,这样提取出来的特征更有适用性。

拟合成GGD

 广义高斯分布GGD的定义:

    

 计算过程不详细说。有两点需要注意,GGD的特点在其模型可以发现数据的非正常分布,比如:

             

 因为数据的特殊分布会产生左倾斜和右倾斜的现象。在图像质量评估中,因为各种distortion的影响,都会导致GGD分布的变形,比如:

     

 可以看到不同的distortion对分布结果产生的影响。

Four orientation

 为了加入相连像素间的关联信息,BRISQUE在计算的时候选取了4个方向分别计算MSCN。

      

 即当前像素与下方,右方,主、次对角线4个方向分别进行计算。

       

        

拟合成AGGD

 非对称性广义高斯分布asymmetric generalized Gaussian distribution(AGGD),定义如下:

         

         

 计算过程不详说,AGGD主要是为了更好的拟合distortion image产生的非对称高斯分布,例如:


 因为不同的distortion会使得AGGD产生不同的左右非对称现象,AGGD的pair parameters能更好的拟合出这种现象。

Two-stagePerformance

 这一步主要是通过对原图和0.5倍原图大小的图像分别提取上述特征,能产生更好的效果。



 综上所述,通过GGD输出2个feature,四个方向AGGD输出4*4=16个feature,再经过twostage,每幅图像共输出2*(2+4*4)=36个feature,将这些feature输入到SVM中做回归即可得到图像distortion的结果。作者的SVM模型是基于TID数据库进行训练的。

作者给出了开源matlab/c++源码:

http://live.ece.utexas.edu/research/quality/

代码需要林智仁教授的libsvm支持:

https://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html

注意因为作者使用的libsvm版本貌似和最新的3.2版本libsvm冲突,所以建议使用3.1版本的libsvm。使用方法非常简单,可以自己写一个脚本做测试:

[plain]  view plain  copy
  1. img=imread('testimage1.bmp');  
  2.   
  3. qualityscore=brisquescore(img);  

得到的qualityscore为图像质量结果,注意因为用svm作回归,qualityscore的结果越高代表图像质量越差。



对于输出feature的部分代码我做了些注释,仅供参考。

[plain]  view plain  copy
  1. function feat = brisque_feature(imdist)  
  2.   
  3. %------------------------------------------------  
  4. % Feature Computation  
  5. %-------------------------------------------------  
  6. scalenum = 2;  
  7. window = fspecial('gaussian',7,7/6);    %创建7*7的高斯滤波器,标准差为7/6  
  8. window = window/sum(sum(window));  
  9.   
  10. feat = [];  
  11. tic         %tic和toc记录matlab命令执行的时间  
  12.   
  13. %循环两次,two-stage framework?  
  14. for itr_scale = 1:scalenum  
  15.   
  16. mu            = filter2(window, imdist, 'same');    %用window对imdist进行滤波  
  17. mu_sq         = mu.*mu;  
  18. sigma         = sqrt(abs(filter2(window, imdist.*imdist, 'same') - mu_sq));  
  19. structdis     = (imdist-mu)./(sigma+1);     %论文中公式(1),计算?I(i,j)  
  20.   
  21. [alpha overallstd]       = estimateggdparam(structdis(:));      %计算zero mean GGD,得到GGD (α, σ ^2 )  
  22. feat                     = [feat alpha overallstd^2];   
  23.   
  24. shifts                   = [ 0 1;1 0 ; 1 1; -1 1];  
  25.    
  26. for itr_shift =1:4  
  27.    
  28. shifted_structdis        = circshift(structdis,shifts(itr_shift,:));    %循环位移  
  29. pair                     = structdis(:).*shifted_structdis(:);  
  30. [alpha leftstd rightstd] = estimateaggdparam(pair);  
  31. const                    =(sqrt(gamma(1/alpha))/sqrt(gamma(3/alpha)));  
  32. meanparam                =(rightstd-leftstd)*(gamma(2/alpha)/gamma(1/alpha))*const;     %公式15  
  33. feat                     =[feat alpha meanparam leftstd^2 rightstd^2];      %对照TABLE 1  
  34.   
  35. end  
  36.   
  37. %feat为最终输出的特征feature 一共含有18项  
  38.   
  39. imdist                   = imresize(imdist,0.5);  
  40.   
  41.   
  42. end  
  43. toc  

猜你喜欢

转载自blog.csdn.net/weixin_36583895/article/details/80815088