[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#define PI 3.14159265358979323846
// 定义结构相似性指数
double ssim(int *img1, int *img2, int width, int height, int sigma)
{
double mu1, mu2, mu1_mu2, sigma1_pow, sigma2_pow, sigma12;
double sum1, sum2, sum3, sum4;
int x, y, i;
double ssim_value = 0.0;
// 计算每个像素的均值
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
mu1 = mu2 = 0.0;
for (i = -sigma; i <= sigma; i++) {
if (y + i < 0 || y + i >= height)
continue;
mu1 += img1[y + i * width + x];
mu2 += img2[y + i * width + x];
}
mu1 /= (2 * sigma + 1);
mu2 /= (2 * sigma + 1);
mu1_mu2 += mu1 * mu2;
}
}
// 计算每个像素的标准差
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
sigma1_pow = sigma2_pow = 0.0;
for (i = -sigma; i <= sigma; i++) {
if (y + i < 0 || y + i >= height)
continue;
sigma1_pow += (img1[y + i * width + x] - mu1) * (img1[y + i * width + x] - mu1);
sigma2_pow += (img2[y + i * width + x] - mu2) * (img2[y + i * width + x] - mu2);
}
sigma1_pow /= (2 * sigma + 1);
sigma2_pow /= (2 * sigma + 1);
sigma12 += (sigma1_pow - pow(mu1_mu2, 0.5)) * (sigma2_pow - pow(mu1_mu2, 0.5));
}
}
// 计算结构相似性指数
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
sum1 += pow((img1[y * width + x] - mu1_mu2), 2);
sum2 += pow((img2[y * width + x] - mu1_mu2), 2);
sum3 += pow(sigma1_pow - pow(mu1_mu2, 0.5), 2);
sum4 += pow(sigma2_pow - pow(mu1_mu2, 0.5), 2);
}
ssim_value += ((2 * mu1_mu2 * sigma12 + sum1 + sum2) /
(2 * sigma1_pow + 2 * sigma2_pow + sum3 + sum4));
}
return ssim_value / (width * height);
}
int main()
{
int img1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int img2[] = {0, 1, 3, 3, 4, 5, 6, 7, 8, 9};
int sigma = 3;
int width = sizeof(img1) / sizeof(img1[0]);
int height = sizeof(img1) / sizeof(img1[0]);
double ssim_value = ssim(img1, img2, width, height, sigma);
printf("SSIM value: %lf\n", ssim_value);