OpenCV 实现SSIM结构相似性算法

SSIM算法的介绍: http://blog.csdn.net/chaipp0607/article/details/70158835

代码做了一下处理: (1)设置两组对比试验,将原图进行核为5*5的滤波,与原图比较求得SSIM指数。将原图进行核为10*10的滤波,与原图比较求得SSIM指数。 (2)将SSIM指数折算为百分制 (3)采用高斯模糊求得图像的均值

代码参考: http://jingyan.baidu.com/article/456c463b67aa310a5931447a.html

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace std; 
using namespace cv;

Scalar getMSSIM(Mat  inputimage1, Mat inputimage2);
int main()
{
    Mat BlurImage1;
    Mat BlurImage2;
    Mat SrcImage = imread("1.jpg");
    blur(SrcImage, BlurImage1, Size(5, 5));
    blur(SrcImage,BlurImage2,Size(10,10));
    Scalar SSIM1 = getMSSIM(SrcImage, BlurImage1);
    Scalar SSIM2 = getMSSIM(SrcImage, BlurImage2);
    printf("模糊5*5通道1:%f\n", SSIM1.val[0] * 100);
    printf("模糊5*5通道2:%f\n", SSIM1.val[1] * 100);
    printf("模糊5*5通道3:%f\n", SSIM1.val[2] * 100);
    printf("模糊5*5:%f\n", (SSIM1.val[2] + SSIM1.val[1] + SSIM1.val[0])/3 * 100);
    printf("模糊10*10通道1:%f\n", SSIM2.val[0] * 100);
    printf("模糊10*10通道2:%f\n", SSIM2.val[1] * 100);
    printf("模糊10*10通道3:%f\n", SSIM2.val[2] * 100);
    printf("模糊10*10:%f\n", (SSIM2.val[2] + SSIM2.val[1] + SSIM2.val[0]) / 3 * 100);
    imshow("原图",SrcImage);
    imshow("模糊5*5",BlurImage1);
    imshow("模糊10*10", BlurImage2);
    waitKey(0);
    return 0;
}
Scalar getMSSIM(Mat  inputimage1, Mat inputimage2)
{
    Mat i1 = inputimage1;
    Mat i2 = inputimage2;
    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通道1:82.523627 模糊5*5通道2:85.781376 模糊5*5通道3:85.903646 模糊5*5:84.736216 模糊10*10通道1:65.029142 模糊10*10通道2:69.286267 模糊10*10通道3:68.664205 模糊10*10:67.659871

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏QQ会员技术团队的专栏

基于 Threejs 的 web 3D 开发入门

随着软硬件的发展,在PC和移动端浏览器上进行web 3D 开发的条件已经基本成熟了,出现了不少 js 3D 库,Threejs 是 js 3D库中的佼佼者。

1.8K3
来自专栏前端新视界

使用 SVG 和 JS 创建一个由星形变心形的动画

序言:首先,这是一篇学习 SVG 及 JS 动画不可多得的优秀文章。我非常喜欢 Ana Tudor 写的教程。在她的教程中有大量使用 SVG 制作的图解以及实...

4505
来自专栏目标检测和深度学习

漫画算法等精选文章目录

1、漫画算法 漫画算法:最小栈的实现 漫画算法:判断 2 的乘方 漫画算法:找出缺失的整数 漫画算法:辗转相除法是什么鬼? 漫画算法:什么是动态规划?(整合版...

4595
来自专栏一“技”之长

挖一挖贝塞尔曲线那些事 原

      贝塞尔曲线的最初设计是服务于工业设计,尤其应用与汽车曲线设计。随着计算机画图的应用广泛,若想在计算机上画出平滑精准的曲线并不是一件容易的事,贝塞尔曲...

431
来自专栏进击的程序猿

神经网络实践之情感分类神经网络实践之情感分类

最近报名了Udacity的深度学习基石,这是第二周的课程,主要是介绍了运用神经网络进行情感分类,课程中是对英文进行了分类,我这边改为了中文。 首先是中文切词,...

1332
来自专栏浅探ARKit

SceneKit绘制模型与骨骼动画的实现

#####研究目的 sceneKit里可以绘制几种几何模型,但那些不规律的形状如果不想使用模型,那么就要自己绘制了 #####demo效果 [1.gif] [U...

6447
来自专栏Android知识点总结

D4-Android绘图之和我一起画箭头

692
来自专栏机器人网

工程师入门速成大法:15幅结构动图看懂机械原理

来自越南的设计师Nguyen Duc Thang使用Inventor绘制了经典的机械结构,并将其制作为动态仿真视频,这些机械结构有利于大家直观的了解机械。 1、...

3385
来自专栏GIS讲堂

Arcgis for JS之Cluster聚类分析的实现(基于区域范围的)

咱们书接上文,在上文,实现了基于距离的空间聚类的算法实现,在本文,将继续介绍空间聚类之基于区域范围的实现方式,好了,闲言少叙,先看看具体的效果:

695
来自专栏周明礼的专栏

Threejs 快速入门

在什么都是3D,看电影3D,打游戏3D,估计3D打车,很快就会面世。那么作为前端开发的标准语言,JS和3D能不能也搞出点大新闻呢?刚好最近在做一个活动时,就遇到...

2.6K1

扫码关注云+社区