在圖像處理算法研究中,很多時候需要有客觀評價指標來對算法的性能進行評價。
比如,在圖像復原、圖像濾波算法研究中,需要采用客觀評價指標來定量的來測試算法恢復出的圖像相對於參考圖像的好壞程度。
本文介紹文獻中提到到三個比較好的客觀評價指標——峰值性噪比PSNR、模糊系數K、質量因素Q,其定義分別是:
這三個指標的詳細定義見參考文獻[1]~[3],下面給出這三個評價指標的MatLab實現。
- %說明:本文件為計算兩幅視頻圖象相對於高清晰圖象的質量,其中:
- %eyechart1.bmp為未處理前質量較差圖象,核心區域的截圖保存為area_eyechart1.bmp
- %eyechart2.bmp為某種算法處理后質量較好圖象,核心區域的截圖保存為area_eyechart2.bmp
- %eyechart3.bmp為高清晰參考圖象,核心區域的截圖保存為area_eyechart3.bmp
- %程序流程為
- %第一步:先分別從eyechart1.bmp、eyechart2.bmp、eyechart3.bmp中截取出核心區域,並分別保存為area_eyechart1.bmp、area_eyechart1.bmp、area_eyechart3.bmp
- %第二步:以area_eyechart3.bmp為參考圖象,計算area_eyechart1.bmp的PSNR、模糊系數KBlur、質量指數Q
- %第三步:以area_eyechart3.bmp為參考圖象,計算area_eyechart2.bmp的PSNR、模糊系數KBlur、質量指數Q
- %程序可直接運行,運行結果為:
- %1.保存並顯示生成的截圖文件area_eyechart1.bmp、area_eyechart1.bmp、area_eyechart3.bmp
- %2、在控制台先顯示第二步的計算結果,即area_eyechart1.bmp的三個質量指標,然后接着顯示第三步的計算結果,即area_eyechart2.bmp的三個質量指標
- %運行結果分析:area_eyechart2.bmp的PSNR和質量指數Q高,表明其質量較好,而area_eyechart1.bmp的模糊系數KBlur較大
- %這是因為其有很多噪聲被當着了邊緣能量來計算,這也從一個方面說明模糊系數KBlur的應用具有局限性,但前者KBlur>1,后者<1,理論上只有模糊的情況下
- %KBlur是<=1的,這也可根據KBlur與1的關系來判定圖象收噪聲污染的程度.
- %******************從eyechart1.bmp,eyechart2.bmp兩個文件中截取測試圖象區域,可保證兩圖象截取的區域嚴格對准*****
- a=imread('eyechart1.bmp','bmp');
- b=a([203:396],[249:440]);
- a=imread('eyechart2.bmp','bmp');
- c=a([203:396],[249:440]);
- %*******************從eyechart3.bmp中截取測試參考圖象,截取部分需要進行縮放,使之與eyechart1.bmp,eyechart2.bmp截取部分大小匹配*******************************************************************
- a=imread('eyechart3.bmp','bmp');
- d=a([62:406],[60:395]);
- e=imresize(d,[length(b(:,1)),length(b(1,:))], 'bicubic');%由於eyechart3.bmp和eyechart1.bmp,eyechart2.bmp比例不一樣,這里要進行比例調整
- imwrite(b,'area_eyechart1.bmp','bmp');
- imwrite(c,'area_eyechart2.bmp','bmp');
- imwrite(e,'area_eyechart3.bmp','bmp');
- subplot(1,3,1);
- imshow(e);
- title('eyechart3.bmp截取部分,參考圖象');
- hold on;
- subplot(1,3,2);
- imshow(b);
- title('eyechart1.bmp截取部分');
- hold on;
- subplot(1,3,3);
- imshow(c);
- title('eyechart2.bmp截取部分');
- %*******************以下部分為計算截取圖象area_eyechart1.bmp和area_eyechart1.bmp的PSNR、模糊系數、質量指數Q*
- % 本文件功能為對計算污染圖象相對於源圖象的質量
- clc;
- clear;
- PSNRenable=1;%PSNR計算使能,為0不計算,為1,計算
- KBlurenable=1;%模糊系數KBlur計算使能,為0不計算,為1,計算
- Qenable=1;%質量指數Q計算使能,為0不計算,為1,計算
- for m=1:2
- imsrcnamehead='area_eyechart3';%源圖象文件名頭
- imsrcnameext='bmp';%源圖象文件名擴展
- if m==1 %以area_eyechart1.bmp為測試圖象
- imdstname=strcat('area_eyechart1','.',imsrcnameext);%污染圖象文件名,可修改
- elseif m==2%以area_eyechart2.bmp為測試圖象
- imdstname=strcat('area_eyechart2','.',imsrcnameext);%污染圖象文件名,可修改
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- iminfo=imfinfo(strcat(imsrcnamehead,'.',imsrcnameext));%源圖象信息讀取
- imsrc=imread(strcat(imsrcnamehead,'.',imsrcnameext));%源圖象讀取
- imdst=imread(imdstname,imsrcnameext);%污染圖象讀取
- doubleimsrc=double(imsrc);%轉換為浮點類型
- doubleimdst=double(imdst);%轉換為浮點類型
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%源圖象和污染圖象讀取
- W=iminfo.Width;%圖象度
- H=iminfo.Height;%圖象高
- %///////////////////PSNR計算/////////////////////////////////
- if PSNRenable==1
- PSNR=0.0;%PSNR賦初值
- for j=1:H
- for i=1:W
- PSNR=PSNR+double((doubleimsrc(j,i)-doubleimdst(j,i))*(doubleimsrc(j,i)-doubleimdst(j,i)));
- end
- end
- PSNR=PSNR/W/H;
- PSNR=10*log10(255*255/PSNR)
- %////////////////////PSNR計算完畢//////////////////////////////////
- end
- %///////////////////模糊系數KBlur計算/////////////////////////////////
- if KBlurenable==1
- Sin=0.0;%Sin賦初值
- Sout=0.0;
- for j=2:H-1
- for i=2:W-1
- t=doubleimsrc(j-1,i+1)+doubleimsrc(j+1,i-1)-doubleimsrc(j-1,i-1)-doubleimsrc(j+1,i+1);
- if t<0 t=-t;
- end
- Sin=Sin+t;%源圖象鄰域邊緣能量計算
- t=doubleimdst(j-1,i+1)+doubleimdst(j+1,i-1)-doubleimdst(j-1,i-1)-doubleimdst(j+1,i+1);
- if t<0 t=-t;
- end
- Sout=Sout+t;%污染圖象鄰域邊緣能量計算
- end
- end
- KBlur=Sout/Sin
- end
- %////////////////////KBlur計算完畢////////////////////////////////////////
- %///////////////////質量指數Q計算//////////////////////////////////////////
- if Qenable==1
- Q=0.0;%Q賦初值
- Qnum=0;%圖象以7X7塊大小計算每塊的Q,逐象素的移動塊窗口,這里Qnum為塊數量的計數
- for j=4:H-3
- for i=4:W-3
- midsrc=0.0;
- middst=0.0;
- varsrc=0.0;
- vardst=0.0;%源圖象和污染圖象塊內的平均值和方差賦初值
- varsrcdst=0.0;%源圖象和污染圖象塊內的協方差賦初值
- for n=-3:3
- for m=-3:3
- midsrc=midsrc+doubleimsrc(j+n,i+m);
- middst=middst+doubleimdst(j+n,i+m);
- end
- end
- midsrc=midsrc/49;
- middst=middst/49;
- %源圖象和污染圖象塊內的平均值計算
- for n=-3:3
- for m=-3:3
- varsrc=varsrc+(doubleimsrc(j+n,i+m)-midsrc)*(doubleimsrc(j+n,i+m)-midsrc);
- vardst=vardst+(doubleimdst(j+n,i+m)-middst)*(doubleimdst(j+n,i+m)-middst);
- varsrcdst=varsrcdst+(doubleimsrc(j+n,i+m)-midsrc)*(doubleimdst(j+n,i+m)-middst);
- end
- end
- varsrc=varsrc/48;
- vardst=vardst/48;
- varsrcdst=varsrcdst/48;
- if ((varsrc+vardst)*(midsrc*midsrc+middst*middst))~=0 %分母不為零的塊才計算質量指數Q
- Q=Q+4*varsrcdst*midsrc*middst/((varsrc+vardst)*(midsrc*midsrc+middst*middst));
- %源圖象和污染圖象塊內Q計算完畢
- Qnum=Qnum+1;%塊計數加1
- end
- end
- end
- Q=Q/Qnum
- end
- %////////////////////質量指數Q計算完畢/////////////////////////////////////
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%圖象質量計算完畢
參考文獻
[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