为了进行视频处理,有必要对测量原始信号与处理信号的差别制定客观评价标准。这非常重要,比如在视频编码应用中必须测量由于压缩引起的失真。这样的理想测度应该与两个视频序列之间观察到的差别有很好的相关性。不过,寻找此类测度的过程证实这是异常困难的任务。尽管提出了多种质量测度,与感知到的视频质量相关性好的标准计算相当复杂。现在设计的大多数视频处理系统使两个视频序列和均方差(MSE)最小,对于彩色视频图像,MSE分别对每个彩色分量计算其MSE。
代替MSE,更常用峰值信噪比(peak signal-to-noise ratio,PSNR,单位dB)作为视频处理后质量测量标准。
对于大多数常见的8bit/彩色视频图像,
PSNR完全由MSE确定。PSNR较MSE更常用,因为人们想把图像质量与某个范围的PSNR相联系。根据实际经验,对于亮度像素分量,
PSNR高于40dB说明图像质量极好(即非常接近原始图像),在30—40dB通常表示图像质量是好的(即失真可以察觉但可以接受),在20—30dB说明图像质量差;最后,PSNR低于20dB图像不可接受。
计算两个序列间的PSNR没什么意义,计算每两个对应图像的PSNR然后把从各Frame获得的值取平均值是不正确的。以上主要定义了两个值,一个是均方差MSE,另一个是峰值信噪比PSNR,公式如下:
这里的MAX通常是图像的灰度级,一般就是255了。
这里就不用什么压缩算法了,就是将图像缩小再放大比较一下,下面是代码:
close all;
clear all;
clc;
img=imread('lena.jpg');
[h w]=size(img);
imgn=imresize(img,[floor(h/2) floor(w/2)]);
imgn=imresize(imgn,[h w]);
img=double(img);
imgn=double(imgn);
B=8; %编码一个像素用多少二进制位
MAX=2^B-1; %图像有多少灰度级
MES=sum(sum((img-imgn).^2))/(h*w); %均方差
PSNR=20*log10(MAX/sqrt(MES)); %峰值信噪比
图像宽高分别缩小1/2再放大到原图,PSNR=30.2dB。
图像宽高分别缩小1/5再放大到原图,PSNR=24.5dB。
可以看出PSNR越高,图像和原图越接近。当然,这都是客观指标,实际评价还有主观指标,不过主观的东西就比较模糊了,每个人感觉都会不同的。
备注:
>> PSNR
PSNR(:,:,1) =
39.5797
PSNR(:,:,2) =
39.7485
PSNR(:,:,3) =
39.3670
这是我求得的一张jpg图片的信噪比。
取得0.1的精度时,得到的结果如下:
>> PSNR
PSNR(:,:,1) =
25.8999
PSNR(:,:,2) =
27.1620
PSNR(:,:,3) =
26.4491
取得0.2的精度时,得到的结果如下:
>> PSNR
PSNR(:,:,1) =
29.8792
PSNR(:,:,2) =
30.3280
PSNR(:,:,3) =
29.9064
取得0.6的精度时,得到的结果如下:
val(:,:,1) =
36.8631
val(:,:,2) =
37.0826
val(:,:,3) =
36.7029
取得0.6的精度时,得到的结果如下:
val(:,:,1) =
42.8358
val(:,:,2) =
43.0407
val(:,:,3) =
42.6587
取得0.7的精度时,得到的结果如下:
val(:,:,1) =
46.8471
val(:,:,2) =
47.0110
val(:,:,3) =
46.6243
取得0.8的精度时,得到的结果如下:
>> PSNR
PSNR(:,:,1) =
53.1992
PSNR(:,:,2) =
53.6231
PSNR(:,:,3) =
53.3431
取得0.9的精度时,得到的结果如下:
PSNR(:,:,1) =
66.8596
PSNR(:,:,2) =
67.2335
PSNR(:,:,3) =
64.1362