zoukankan      html  css  js  c++  java
  • 图像质量评价指标之Matlab实现

    在图像处理算法研究中,很多时候需要有客观评价指标来对算法的性能进行评价。

    比如,在图像复原、图像滤波算法研究中,需要采用客观评价指标来定量的来测试算法恢复出的图像相对于参考图像的好坏程度。

    本文介绍文献中提到到三个比较好的客观评价指标——峰值性噪比PSNR、模糊系数K、质量因素Q,其定义分别是:

    这三个指标的详细定义见参考文献[1]~[3],下面给出这三个评价指标的MatLab实现。

    [html] view plaincopy
     
    1. %说明:本文件为计算两幅视频图象相对于高清晰图象的质量,其中:  
    2.   
    3. %eyechart1.bmp为未处理前质量较差图象,核心区域的截图保存为area_eyechart1.bmp  
    4.   
    5. %eyechart2.bmp为某种算法处理后质量较好图象,核心区域的截图保存为area_eyechart2.bmp  
    6.   
    7. %eyechart3.bmp为高清晰参考图象,核心区域的截图保存为area_eyechart3.bmp  
    8.   
    9.    
    10.   
    11. %程序流程为  
    12.   
    13. %第一步:先分别从eyechart1.bmp、eyechart2.bmp、eyechart3.bmp中截取出核心区域,并分别保存为area_eyechart1.bmp、area_eyechart1.bmp、area_eyechart3.bmp  
    14.   
    15. %第二步:以area_eyechart3.bmp为参考图象,计算area_eyechart1.bmp的PSNR、模糊系数KBlur、质量指数Q  
    16.   
    17. %第三步:以area_eyechart3.bmp为参考图象,计算area_eyechart2.bmp的PSNR、模糊系数KBlur、质量指数Q  
    18.   
    19.    
    20.   
    21. %程序可直接运行,运行结果为:  
    22.   
    23. %1.保存并显示生成的截图文件area_eyechart1.bmp、area_eyechart1.bmp、area_eyechart3.bmp  
    24.   
    25. %2、在控制台先显示第二步的计算结果,即area_eyechart1.bmp的三个质量指标,然后接着显示第三步的计算结果,即area_eyechart2.bmp的三个质量指标  
    26.   
    27.    
    28.   
    29. %运行结果分析:area_eyechart2.bmp的PSNR和质量指数Q高,表明其质量较好,而area_eyechart1.bmp的模糊系数KBlur较大  
    30.   
    31. %这是因为其有很多噪声被当着了边缘能量来计算,这也从一个方面说明模糊系数KBlur的应用具有局限性,但前者KBlur>1,后者<1,理论上只有模糊的情况下  
    32.   
    33. %KBlur是<=1的,这也可根据KBlur与1的关系来判定图象收噪声污染的程度.  
    34.   
    35.    
    36.   
    37. %******************从eyechart1.bmp,eyechart2.bmp两个文件中截取测试图象区域,可保证两图象截取的区域严格对准*****  
    38.   
    39. a=imread('eyechart1.bmp','bmp');  
    40.   
    41. b=a([203:396],[249:440]);  
    42.   
    43. a=imread('eyechart2.bmp','bmp');  
    44.   
    45. c=a([203:396],[249:440]);  
    46.   
    47.    
    48.   
    49. %*******************从eyechart3.bmp中截取测试参考图象,截取部分需要进行缩放,使之与eyechart1.bmp,eyechart2.bmp截取部分大小匹配*******************************************************************  
    50.   
    51. a=imread('eyechart3.bmp','bmp');  
    52.   
    53. d=a([62:406],[60:395]);  
    54.   
    55. e=imresize(d,[length(b(:,1)),length(b(1,:))], 'bicubic');%由于eyechart3.bmp和eyechart1.bmp,eyechart2.bmp比例不一样,这里要进行比例调整  
    56.   
    57. imwrite(b,'area_eyechart1.bmp','bmp');  
    58.   
    59. imwrite(c,'area_eyechart2.bmp','bmp');  
    60.   
    61. imwrite(e,'area_eyechart3.bmp','bmp');  
    62.   
    63.    
    64.   
    65. subplot(1,3,1);  
    66.   
    67. imshow(e);  
    68.   
    69. title('eyechart3.bmp截取部分,参考图象');  
    70.   
    71. hold on;  
    72.   
    73. subplot(1,3,2);  
    74.   
    75. imshow(b);  
    76.   
    77. title('eyechart1.bmp截取部分');  
    78.   
    79. hold on;  
    80.   
    81. subplot(1,3,3);  
    82.   
    83. imshow(c);  
    84.   
    85. title('eyechart2.bmp截取部分');  
    86.   
    87. %*******************以下部分为计算截取图象area_eyechart1.bmp和area_eyechart1.bmp的PSNR、模糊系数、质量指数Q*  
    88.   
    89. % 本文件功能为对计算污染图象相对于源图象的质量  
    90.   
    91. clc;  
    92.   
    93. clear;  
    94.   
    95. PSNRenable=1;%PSNR计算使能,为0不计算,为1,计算  
    96.   
    97. KBlurenable=1;%模糊系数KBlur计算使能,为0不计算,为1,计算  
    98.   
    99. Qenable=1;%质量指数Q计算使能,为0不计算,为1,计算  
    100.   
    101.    
    102.   
    103. for m=1:2  
    104.   
    105. imsrcnamehead='area_eyechart3';%源图象文件名头  
    106.   
    107. imsrcnameext='bmp';%源图象文件名扩展  
    108.   
    109. if m==1 %以area_eyechart1.bmp为测试图象  
    110.   
    111. imdstname=strcat('area_eyechart1','.',imsrcnameext);%污染图象文件名,可修改  
    112.   
    113. elseif m==2%以area_eyechart2.bmp为测试图象  
    114.   
    115.   imdstname=strcat('area_eyechart2','.',imsrcnameext);%污染图象文件名,可修改  
    116.   
    117. end  
    118.   
    119. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
    120.   
    121. iminfo=imfinfo(strcat(imsrcnamehead,'.',imsrcnameext));%源图象信息读取  
    122.   
    123. imsrc=imread(strcat(imsrcnamehead,'.',imsrcnameext));%源图象读取  
    124.   
    125. imdst=imread(imdstname,imsrcnameext);%污染图象读取  
    126.   
    127. doubleimsrc=double(imsrc);%转换为浮点类型  
    128.   
    129. doubleimdst=double(imdst);%转换为浮点类型  
    130.   
    131. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%源图象和污染图象读取  
    132.   
    133. W=iminfo.Width;%图象度  
    134.   
    135. H=iminfo.Height;%图象高  
    136.   
    137. %///////////////////PSNR计算/////////////////////////////////  
    138.   
    139. if PSNRenable==1  
    140.   
    141. PSNR=0.0;%PSNR赋初值  
    142.   
    143. for j=1:H  
    144.   
    145.   for i=1:W  
    146.   
    147.       PSNR=PSNR+double((doubleimsrc(j,i)-doubleimdst(j,i))*(doubleimsrc(j,i)-doubleimdst(j,i)));  
    148.   
    149.   end  
    150.   
    151. end  
    152.   
    153. PSNR=PSNR/W/H;  
    154.   
    155. PSNR=10*log10(255*255/PSNR)  
    156.   
    157. %////////////////////PSNR计算完毕//////////////////////////////////  
    158.   
    159. end  
    160.   
    161. %///////////////////模糊系数KBlur计算/////////////////////////////////  
    162.   
    163. if KBlurenable==1  
    164.   
    165. Sin=0.0;%Sin赋初值  
    166.   
    167. Sout=0.0;  
    168.   
    169. for j=2:H-1  
    170.   
    171.   for i=2:W-1  
    172.   
    173.       t=doubleimsrc(j-1,i+1)+doubleimsrc(j+1,i-1)-doubleimsrc(j-1,i-1)-doubleimsrc(j+1,i+1);  
    174.   
    175.       if t<t=-t;  
    176.   
    177.       end  
    178.   
    179.       Sin=Sin+t;%源图象邻域边缘能量计算  
    180.   
    181.       t=doubleimdst(j-1,i+1)+doubleimdst(j+1,i-1)-doubleimdst(j-1,i-1)-doubleimdst(j+1,i+1);  
    182.   
    183.       if t<t=-t;  
    184.   
    185.       end  
    186.   
    187.       Sout=Sout+t;%污染图象邻域边缘能量计算  
    188.   
    189.   end  
    190.   
    191. end  
    192.   
    193. KBlur=Sout/Sin  
    194.   
    195. end  
    196.   
    197. %////////////////////KBlur计算完毕////////////////////////////////////////  
    198.   
    199.    
    200.   
    201. %///////////////////质量指数Q计算//////////////////////////////////////////  
    202.   
    203. if Qenable==1  
    204.   
    205. Q=0.0;%Q赋初值  
    206.   
    207. Qnum=0;%图象以7X7块大小计算每块的Q,逐象素的移动块窗口,这里Qnum为块数量的计数  
    208.   
    209. for j=4:H-3  
    210.   
    211.   for i=4:W-3  
    212.   
    213.       midsrc=0.0;  
    214.   
    215.       middst=0.0;  
    216.   
    217.       varsrc=0.0;  
    218.   
    219.       vardst=0.0;%源图象和污染图象块内的平均值和方差赋初值  
    220.   
    221.       varsrcdst=0.0;%源图象和污染图象块内的协方差赋初值  
    222.   
    223.       for n=-3:3  
    224.   
    225.           for m=-3:3  
    226.   
    227.               midsrc=midsrc+doubleimsrc(j+n,i+m);  
    228.   
    229.               middst=middst+doubleimdst(j+n,i+m);  
    230.   
    231.           end  
    232.   
    233.       end  
    234.   
    235.       midsrc=midsrc/49;  
    236.   
    237.       middst=middst/49;  
    238.   
    239.       %源图象和污染图象块内的平均值计算  
    240.   
    241.       for n=-3:3  
    242.   
    243.           for m=-3:3  
    244.   
    245.              varsrc=varsrc+(doubleimsrc(j+n,i+m)-midsrc)*(doubleimsrc(j+n,i+m)-midsrc);  
    246.   
    247.              vardst=vardst+(doubleimdst(j+n,i+m)-middst)*(doubleimdst(j+n,i+m)-middst);  
    248.   
    249.              varsrcdst=varsrcdst+(doubleimsrc(j+n,i+m)-midsrc)*(doubleimdst(j+n,i+m)-middst);  
    250.   
    251.           end  
    252.   
    253.       end  
    254.   
    255.       varsrc=varsrc/48;  
    256.   
    257.       vardst=vardst/48;  
    258.   
    259.       varsrcdst=varsrcdst/48;  
    260.   
    261.       if ((varsrc+vardst)*(midsrc*midsrc+middst*middst))~=0 %分母不为零的块才计算质量指数Q  
    262.   
    263.       Q=Q+4*varsrcdst*midsrc*middst/((varsrc+vardst)*(midsrc*midsrc+middst*middst));  
    264.   
    265.       %源图象和污染图象块内Q计算完毕  
    266.   
    267.       Qnum=Qnum+1;%块计数加1  
    268.   
    269.       end  
    270.   
    271.   end  
    272.   
    273. end  
    274.   
    275. Q=Q/Qnum  
    276.   
    277. end  
    278.   
    279. %////////////////////质量指数Q计算完毕/////////////////////////////////////  
    280.   
    281. end  
    282.   
    283. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%图象质量计算完毕  

    参考文献

    [1]袁飞,黄联芬,姚彦,视频质量客观评价技术研究,标准、检测与仪器,2007(3):91-94

    [2]黄文辉 ,陈仁雷 ,张家谋,数字视频图像质量客观测量方法的改进与实现,北京邮电大学学报,2005(4):87-90

    [3]Zhou Wang, Hamid R.Sheikh , Alan C. Bovik,Objective video quality assessment(Chapter 41 in The Handbook of Video Databases: Design and Applications)., CRC Press, 2003(1041-1078)

     转自:http://blog.csdn.net/droidpioneer/article/details/6612441

  • 相关阅读:
    fetch与xhr的对比
    使用 fetch
    数组的剩余方法
    slice方法与splice方法
    php命名空间使用
    PHP面向对象编程学习之对象基础
    ubuntu下lamp环境配置及将window代码迁移至linux系统
    ThinkPHP中使用ajax接收json数据的方法
    给js文件传递参数
    JavaScript和php常用语法——切割字符串
  • 原文地址:https://www.cnblogs.com/sweeeper/p/4620432.html
Copyright © 2011-2022 走看看