您的位置:首页 > 运维架构

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

2016-03-08 11:30 597 查看
Refer from http://jingyan.baidu.com/article/456c463b67aa310a5931447a.html


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

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


工具/原料

OpenCV环境

code:blocks


方法/步骤

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: