opencv图像处理学习(五十七)——峰值信噪比和结构相似性

1.峰值信噪比(PSNR)

峰值信噪比是常用的衡量信号失真的指标。该参数是基于图像像素灰度值进行统计分析,但是由于人类视觉特性的差异性,通常出现的评价结果与人的主管感觉不一致,但其仍然是一个有参考价值的评价指标。对于两幅图像I与K,尺寸大小为m x n,它们的均方误差的定义为公式:

            MSE=\frac{1}{mn}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1}||I(i,j)-k(i,j)||^{2}                                         

       那么信噪比的定义为公式:

            PSNR=10\cdot log_{10}(\frac{MAX_{I}^{2}}{MSE})=20.log_{10}(\frac{MAX_{I}}{MSE})           

其中,MSE表示当前图像I与K的均方误差, 表示图像点颜色的最大值。PSNE的单位为dB,在图像质量评价中,典型的峰值信噪比为30~40dB。PSNR的值越大,图像质量越好。

double PSNR(const cv::Mat& I1, const cv::Mat& I2)
{
	cv::Mat s1;
	cv::absdiff(I1, I2, s1);//计算图像差
	s1.convertTo(s1, CV_32F);//转成32浮点数进行平方运算
	//s1*s1,即|I1-I2|^2
	s1 = s1.mul(s1);
	cv::Scalar s = cv::sum(s1);//分别叠加每个通道元素,存于s中
	double sse = s.val[0] + s.val[1] + s.val[2];//计算所有通道元素和

	if (sse <= 1e-10)//当元素很小时返回0值
	{
		return 0;
	}

	else
	{
		double mse = sse / ((double)(I1.channels() * I1.total()));
		double psnr = 10.0*log10((255 * 255) / mse);
		return psnr;
	}
}

2.结构相似性(SSIM)

结构相似性是高度结构化的自然影像,从亮度、对比度、结构三方面评价图像质量,故邻域像素具有较强的关联性,即物体结构信息的相似性,对比峰值信噪比更复合人类视觉观察到的直观效果,其具有对称性、上下界等性质。

给定两个信号x和y。两者的结构相似性定义为公式:

\left\{\begin{matrix} SSIM=[l(x,y)]^{\alpha }\[c(x,y)]^{\beta }[s(x,y)]^{\gamma }\\l(x,y)=\frac{2\mu _{x}\mu _{u}+C_{1}}{\mu _{x}^{2}+\mu _{y}^{2}+C_{1}} \\ c(x,y)=\frac{2\sigma _{x}\sigma _{y}+C_{2}}{\sigma _{x}^{2}+\sigma _{y}^{2}+C_{2}}\\s(x,y)=\frac{\sigma _{xy}+C_{3}}{\sigma _{x}\sigma _{y}+C_{3}} \end{matrix}\right.

其中l(x,y)表示x和y的亮度,c(x,y)代表x和y的对比度,s(x,y)表示x和y的结构,\alpha ,\beta ,\gamma(都大于0)为SSIM参数调整,\mu _{x}\mu _{y}分别表示图像x和y的均值,\sigma _{x}\sigma _{y}分别表示图像x和y的方差,\sigma _{xy}表示图像x和y的协方差,C_{1},C_{2},C_{3} 为常数。SSIM的取值范围为0到1,值越大越好。

cv::Scalar MSSIM(const cv::Mat& i1, const cv::Mat& i2)
{
	const double C1 = 6.5025, C2 = 58.5225;
	cv::Mat I1, I2;
	i1.convertTo(I1, CV_32F);
	i2.convertTo(I2, CV_32F);
	cv::Mat I2_2 = I2.mul(I2);//I2^2
	cv::Mat I1_2 = I1.mul(I1);
	cv::Mat I1_I2 = I1.mul(I2);

	cv::Mat mu1, mu2;

	cv::GaussianBlur(I1, mu1, cv::Size(11, 11), 1.5);//高斯加权计算每一窗口的均值、方差以及协方差
	cv::GaussianBlur(I2, mu2, cv::Size(11, 11), 1.5);

	cv::Mat mu1_2 = mu1.mul(mu1);
	cv::Mat mu2_2 = mu2.mul(mu2);
	cv::Mat mu1_mu2 = mu1.mul(mu2);
	cv::Mat sigma1_2, sigma2_2, sigma12;

	cv::GaussianBlur(I1_2, sigma1_2, cv::Size(11, 11), 1.5);
	sigma1_2 -= mu1_2;
	cv::GaussianBlur(I2_2, sigma2_2, cv::Size(11, 11), 1.5);
	sigma2_2 -= mu2_2;
	cv::GaussianBlur(I1_I2, sigma12, cv::Size(11, 11), 1.5);
	sigma12 -= mu1_mu2;

	//根据公式计算相应参数
	cv::Mat t1, t2, t3;
	t1 = 2 * mu1_mu2 + C1;
	t2 = 2 * sigma12 + C2;
	//t3 = ((2*mu1_mu2+C1).*(2*sigma12+C2))
	t3 = t1.mul(t2);
	t1 = mu1_2 + mu2_2 + C1;
	t2 = sigma1_2 + sigma2_2 + C2;
	//t1 = ((mu1_2+mu2_2+C1).*(sigma1_2+sigma2_2+C2))
	t1 = t1.mul(t2);
	
	cv::Mat ssim_map;
	//ssim_map = t3  ./ t1;
	cv::divide(t3, t1, ssim_map);
	cv::Scalar mssim = mean(ssim_map);
	return mssim;
}

  • 1
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值