OpenCV图像质量评价的SSIM算法(图像相似度)

2025-10-24 10:45:47

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);

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢