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

Refer from http://jingyan.baidu.com/article/456c463b67aa310a5931447a.html

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


SSIM 是一种衡量图象的质量的算法,它克服了原有PSNR固有的一些局限性。SSIM的性能好,但是其付出的代价也很大。本经验将在Ubuntu系统下介绍基于SSIM的图像比较算法。

工具/原料

  • OpenCV环境

  • code:blocks

方法/步骤

  1. 1

    新建项目或打开原有项目,添加ssim在使用中所需要的库。

    #include <opencv2/imgproc/imgproc.hpp>

    #include <opencv2/core/core.hpp>

    #include <opencv2/highgui/highgui.hpp>

  2. 2

    添加命名空间于SSIM调用函数前

    using namespace std;using namespace cv;

  3. 3

    添加函数声明。

    Scalar getMSSIM(char * imagePatha,char * imagePathb);

    其中参数imagePatha和imagePathb分别是要判定相似度的两张图片的路径,Scalar将会存储两张图像在不同颜色通道中的相似度。

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


你可能感兴趣的:(OpenCV图像质量评价的SSIM算法(图像相似度))