在影像處理演算法研究中,很多時候需要有客觀評價指標來對演算法的效能進行評價。
比如,在映像複原、映像濾波演算法研究中,需要採用客觀評價指標來定量的來測試演算法恢複出的映像相對於參考映像的好壞程度。
本文介紹文獻中提到到三個比較好的客觀評價指標——峰值性噪比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:2imsrcnamehead='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==1PSNR=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))); endendPSNR=PSNR/W/H;PSNR=10*log10(255*255/PSNR)%////////////////////PSNR計算完畢//////////////////////////////////end%///////////////////模糊係數KBlur計算/////////////////////////////////if KBlurenable==1Sin=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;%汙染圖象鄰域邊緣能量計算 endendKBlur=Sout/Sinend%////////////////////KBlur計算完畢//////////////////////////////////////// %///////////////////品質指數Q計算//////////////////////////////////////////if Qenable==1Q=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 endendQ=Q/Qnumend%////////////////////品質指數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)