Created
February 20, 2013 09:14
-
-
Save boatgm/4994192 to your computer and use it in GitHub Desktop.
图像质量监测的matlib实现。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| %说明:本文件为计算两幅视频图象相对于高清晰图象的质量,其中: | |
| %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);%污染图象读取 | |
| doubledoubleimsrc=double(imsrc);%转换为浮点类型 | |
| doubledoubleimdst=double(imdst);%转换为浮点类型 | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%源图象和污染图象读取 | |
| W=iminfo.Width;%图象度 | |
| H=iminfo.Height;%图象高 | |
| %///////////////////PSNR计算///////////////////////////////// | |
| if PSNRenable==1 | |
| PSNR=0.0;%PSNR赋初值 | |
| for j=1:H | |
| for i=1:W | |
| PSNRPSNR=PSNR+double((doubleimsrc(j,i)-doubleimdst(j,i))*(doubleimsrc(j,i)-doubleimdst(j,i))); | |
| end | |
| end | |
| PSNRPSNR=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 | |
| SinSin=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 | |
| SoutSout=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 | |
| midsrcmidsrc=midsrc+doubleimsrc(j+n,i+m); | |
| middstmiddst=middst+doubleimdst(j+n,i+m); | |
| end | |
| end | |
| midsrcmidsrc=midsrc/49; | |
| middstmiddst=middst/49; | |
| %源图象和污染图象块内的平均值计算 | |
| for n=-3:3 | |
| for m=-3:3 | |
| varsrcvarsrc=varsrc+(doubleimsrc(j+n,i+m)-midsrc)*(doubleimsrc(j+n,i+m)-midsrc); | |
| vardstvardst=vardst+(doubleimdst(j+n,i+m)-middst)*(doubleimdst(j+n,i+m)-middst); | |
| varsrcdstvarsrcdst=varsrcdst+(doubleimsrc(j+n,i+m)-midsrc)*(doubleimdst(j+n,i+m)-middst); | |
| end | |
| end | |
| varsrcvarsrc=varsrc/48; | |
| vardstvardst=vardst/48; | |
| varsrcdstvarsrcdst=varsrcdst/48; | |
| if ((varsrc+vardst)*(midsrc*midsrc+middst*middst))~=0 %分母不为零的块才计算质量指数Q | |
| QQ=Q+4*varsrcdst*midsrc*middst/((varsrc+vardst)*(midsrc*midsrc+middst*middst)); | |
| %源图象和污染图象块内Q计算完毕 | |
| QnumQnum=Qnum+1;%块计数加1 | |
| end | |
| end | |
| end | |
| QQ=Q/Qnum | |
| end | |
| %////////////////////质量指数Q计算完毕///////////////////////////////////// | |
| end | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%图象质量计算完毕 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment