update:2018-04-07
今天发现ssim的计算里面有高斯模糊,为了快速计算,先对每个小块进行计算,然后计算所有块的平均值。可以参考源代码实现,而且代码实现有近似的在里面!matlab中中图像PSNR和SSIM的计算
“在实际应用中,可以利用滑动窗将图像分块,令分块总数为N,考虑到窗口形状对分块的影响,采用高斯加权计算每一窗口的均值、方差以及协方差,然后计算对应块的结构相似度SSIM,最后将平均值作为两图像的结构相似性度量,即平均结构相似性MSSIM”
function [mssim, ssim_map] = ssim_index(img1, img2, K, window, L) C1 = (K(1)*L)^2; C2 = (K(2)*L)^2; window = window/sum(sum(window)); img1 = double(img1); img2 = double(img2); mu1 = filter2(window, img1, 'valid'); mu2 = filter2(window, img2, 'valid'); mu1_sq = mu1.*mu1; mu2_sq = mu2.*mu2; mu1_mu2 = mu1.*mu2; sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq; sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq; sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2; if (C1 > 0 & C2 > 0) ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2)); else numerator1 = 2*mu1_mu2 + C1; numerator2 = 2*sigma12 + C2; denominator1 = mu1_sq + mu2_sq + C1; denominator2 = sigma1_sq + sigma2_sq + C2; ssim_map = ones(size(mu1)); index = (denominator1.*denominator2 > 0); ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index)); index = (denominator1 ~= 0) & (denominator2 == 0); ssim_map(index) = numerator1(index)./denominator1(index); end mssim = mean2(ssim_map); return
1.PSNR,峰值信噪比
通常用来评价一幅图像压缩后和原图像相比质量的好坏,当然,压缩后图像一定会比原图像质量差的,所以就用这样一个评价指标来规定标准了。PSNR越高,压缩后失真越小。这里主要定义了两个值,一个是均方差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越高,图像和原图越接近。当然,这都是客观指标,实际评价还有主观指标,不过主观的东西就比较模糊了,每个人感觉都会不同的。最常用的全参考视频质量评价方法有以下2种:
PSNR(峰值信噪比):用得最多,但是其值不能很好地反映人眼主观感受。一般取值范围:20-40.值越大,视频质量越好。
SSIM(结构相似性):计算稍复杂,其值可以较好地反映人眼主观感受。一般取值范围:0-1.值越大,视频质量越好。
PSNR,SSIM计算有如下工具可选:
MSU Video Quality Measurement Tool:商业软件,图形化界面,易上手,使用有限制。
Evalvid中的psnr.exe:开源软件,命令行界面,使用无限制。推荐,适合批处理。
- 偶然发现了一个很好的网站。里面包含了大量主观评价算法的数据,导入到Matlab中就可以使用。http://sse.tongji.edu.cn/linzhang/IQA/IQA.htm
注:MOS(Mean Opnion Score,平均意见分)是主观评价实验之后,得到的主观分数,取值0-100,值越大,代表主观感受越好。以下实验数据来自Live数据库:http://live.ece.utexas.edu/research/Quality/
实际使用时,简化起见,一般会将参数设为及,得到:
在计算两张影像的结构相似性指标时,会开一个局部性的视窗,一般为×的小区块,计算出视窗内信号的结构相似性指标,每次以像素为单位移动视窗,直到整张影像每个位置的局部结构相似性指标都计算完毕。将全部的局部结构相似性指标平均起来即为两张影像的结构相似性指标。
- 在实际应用中,可以利用滑动窗将图像分块,令分块总数为N,考虑到窗口形状对分块的影响,采用高斯加权计算每一窗口的均值、方差以及协方差,然后计算对应块的结构相似度SSIM,最后将平均值作为两图像的结构相似性度量,即平均结构相似性MSSIM:
opencv和matlab都有现成的函数可以使用。
参考:图像质量评价--SSIM
图像质量评价指标
- update 2018-07-0716:50:16
- 均方误差(MSE)和均方根误差(RMSE)和平均绝对误差(MAE)
MSE: Mean Squared Error
均方误差是指参数估计值与参数真值之差平方的期望值;
MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
RMSE
均方误差:均方根误差是均方误差的算术平方根
MAE :Mean Absolute Error
平均绝对误差是绝对误差的平均值
平均绝对误差能更好地反映预测值误差的实际情况.
SD :standard Deviation
标准差:标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组组数据,标准差未必相同。
SROCC被认为是最好的非线性相关指标,这是因为,SROCC只与序列中元素的排序有关。因此即使X或Y被任何单调非线性变换作用(如对数变换、指数变换),都不会对SROCC造成任何影响,因为不会影响元素的排序。维基百科有一张很直观的图片,很好地体现了SROCC与PLCC的区别。
除此之外,还有一个Kendall秩序相关系数(KROCC),它的定义是pairwise的:
KROCC = (同序对数-逆序对数) / 总对数 (总对数=n(n - 1)/2)它的性质与SROCC类似,但是比较抖。对于连续输出的机器学习模型或简单的回归拟合,发Paper的话,一般要放SROCC和PLCC,这两个标准是最重要的,可以很好地衡量模型的非线性相关性和线性相关性。偶尔也会放KROCC和RMSE(方均根误差)。但是SROCC是比PLCC更为根本的指标,因为一个复杂模型总可以用一些附加的非线性变换(对数或者指数,还有某些领域内recommanded复杂的组合= =)来补正,使得PLCC更高一些,而SROCC却不能被这些附加非线性变换来影响。