OpenCV图像质量评价的SSIM算法(图像相似度)
1、新建项目或打开原有项目,添加ssim在使用中所需要的库。#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>
2、添加命名空间于SSIM调用函数前using namespace std;using namespace cv;
3、添加函数声明。Scalar getMSSIM(char * imagePatha,char * imagePathb);其中参数imagePatha和imagePathb分别是要判定相似度的两张图片的路径,Scalar将会存储两张图像在不同颜色通道中的相似度。
4、添加函数体。将SSIM函数添加至命名空间后。该函数主要功熹栳缂靖能是时哟功能ssim算法对两张图像进行比较,并将图像在各通道比较的结果以scalar形式返回。Scalar getMSSIM(char * imagePatha,char * imagePathb){ Mat i1=imread(imagePatha); Mat i2=imread(imagePathb); const double C1 = 6.5025, C2 = 58.5225; int d = CV_32F; Mat I1, I2; i1.convertTo(I1, d); i2.convertTo(I2, d); Mat I2_2 = I2.mul(I2); Mat I1_2 = I1.mul(I1); Mat I1_I2 = I1.mul(I2); Mat mu1, mu2; GaussianBlur(I1, mu1, Size(11, 11), 1.5); GaussianBlur(I2, mu2, Size(11, 11), 1.5); Mat mu1_2 = mu1.mul(mu1); Mat mu2_2 = mu2.mul(mu2); Mat mu1_mu2 = mu1.mul(mu2); Mat sigma1_2, sigma2_2, sigma12; GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5); sigma1_2 -= mu1_2; GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5); sigma2_2 -= mu2_2; GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5); sigma12 -= mu1_mu2; Mat t1, t2, t3; t1 = 2 * mu1_mu2 + C1; t2 = 2 * sigma12 + C2; t3 = t1.mul(t2); t1 = mu1_2 + mu2_2 + C1; t2 = sigma1_2 + sigma2_2 + C2; t1 = t1.mul(t2); Mat ssim_map; divide(t3, t1, ssim_map); Scalar mssim = mean( ssim_map ); return mssim;}
5、显示数据。数据以scalar格式倦虺赳式保存,读取scalar内的数据即可获取相应的相似度值,其中值的范围在0~1之间,1为完全一致,0为完全不一至。printf("%f\n",mssimV.val[0] * 100);printf("%f\n",mssimV.val[1] * 100);printf("%f\n",mssimV.val[2] * 100);